将一个字符数组分配给另一个会产生错误。为啥?

Posted

技术标签:

【中文标题】将一个字符数组分配给另一个会产生错误。为啥?【英文标题】:Assigning one character array to another gives Error. Why?将一个字符数组分配给另一个会产生错误。为什么? 【发布时间】:2016-06-25 12:56:31 【问题描述】:

数组的名称是指向第一个元素的指针。那么为什么一个字符数组不能分配另一个数组呢?

#include<stdio.h>
int main()

  char str1[]="Hello";
  char str2[10];
  char *s="Good Morning";
  char *q;
  str2=str1;  /* Error */
  q=s; /* Works */
  return 0;

【问题讨论】:

你不能assign给一个数组,但是你可以copy给它。 "数组的名称是指向第一个元素的指针" - 不,数组 衰减 指向指向其第一个元素的指针。它们不是一回事。 【参考方案1】:

首先,数组的名称与指向第一个元素的指针不同。在某些情况下,数组名称会衰减为指向第一个元素的指针,但通常它们并不相同。

遇到您的问题,数组名称不是可修改的左值,因此无法分配。

C11左值、数组和函数指示符引用第 §6.3.2.1 章

[...] 可修改的左值是一个左值 没有数组类型, 没有不完整的类型,没有 const 限定 类型,如果它是结构或联合,则没有任何成员(包括, 递归地,所有包含的聚合或联合的任何成员或元素)具有 const 限定 输入。

对于赋值运算符,LHS 应该是一个可修改的左值。

引用C11,第 6.5.16 章,

赋值运算符应该有一个可修改的左值作为它的左操作数。

在你的情况下,

 str2=str1;

str2 不是可修改的左值。因此,您会收到错误消息。

FWIW,要复制内容,您可以使用string.h 头文件中的strcpy()

【讨论】:

但是使用strcpy要小心!请注意,如果您执行strcpy(str2,s);,将会发生不好的事情【参考方案2】:

表达式中的数组自动转换为指向数组第一个元素的指针,sizeof 运算符和一元 &amp; 运算符的操作数除外,因此您不能分配给数组。

#include &lt;string.h&gt; 添加到代码头部并使用strcpy() 是复制字符串的好方法之一。

#include<stdio.h>
#include<string.h>
int main(void)

  char str1[]="Hello";
  char str2[10];
  char *s="Good Morning";
  char *q;
  strcpy(str2, str1);  /* Works */
  q=s; /* Works */
  return 0;

【讨论】:

char str[] 与 char *str 相同。你的意思是一个数组一旦声明就不能指向任何其他内存? @SaketAnand No. char str[]char *str 不同,除非它在函数的参数中。

以上是关于将一个字符数组分配给另一个会产生错误。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

将递归函数分配给python中的变量

Angular 4:如何将字符串数组分配给反应形式的复选框

将数组分配给 html 数据

C#将char和char数组分配给字符串?

将一个数组分配给另一个数组c ++ [重复]

无法将数组分配给打字稿中的另一个数组