将一个字符数组分配给另一个给出错误。 为什么?
数组的名称是指向第一个元素的指针。 那么为什么一个字符数组不能分配另一个数组呢?
#include int main() { char str1[]="Hello"; char str2[10]; char *s="Good Morning"; char *q; str2=str1; /* Error */ q=s; /* Works */ return 0; }
表达式中的数组自动转换为指向数组第一个元素的指针,但sizeof
运算符和一元&
运算符的操作数除外,因此无法分配给数组。
将#include
添加到代码的头部并使用strcpy()
是复制字符串的好方法之一。
#include #include int main(void) { char str1[]="Hello"; char str2[10]; char *s="Good Morning"; char *q; strcpy(str2, str1); /* Works */ q=s; /* Works */ return 0; }
首先,数组的名称与指向第一个元素的指针不同。 在某些情况下,数组名称会衰减到指向第一个元素的指针,但通常它们不相同。
在那里遇到问题,数组名称不是可修改的左值,因此无法分配它们。
引用C11
,Lvalues ,数组和函数指示符的章节§6.3.2.1
[…] 可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果它是结构或联合,则没有任何成员(包括,递归地,所有包含聚合或联合的任何成员或元素)具有const限定类型。
对于赋值运算符,LHS应该是可修改的左值。
引用C11
,章节§6.5.16,
赋值运算符应具有可修改的左值作为其左操作数。
在你的情况下,
str2=str1;
str2
不是可修改的左值。 因此,你得到错误。
FWIW,要复制内容,可以使用string.h
头文件中的strcpy()
。