C中的Char数组声明和初始化

我很好奇为什么在C中不允许这样做:

char myarray[4]; myarray = "abc"; 

这是允许的:

 char myarray[4] = "abc"; 

我知道在第一种情况下我应该使用strcpy

 char myarray[4]; strcpy(myarray, "abc"); 

但是为什么不允许声明和后来的初始化,允许声明和同步初始化? 它与C程序的内存映射有关吗?

谢谢!

那是因为你的第一个代码片段没有执行初始化 ,而是分配

 char myarray[4] = "abc"; // Initialization. myarray = "abc"; // Assignment. 

并且数组不能直接在C中分配。

名称myarray实际上解析为其第一个元素( &myarray[0] )的地址,该元素不是左值 ,因此不能作为赋值的目标。

是的,这是语言中的一种不一致。

myarray = "abc";的“=” myarray = "abc"; 赋值(由于数组基本上是一种常量指针,它不起作用),而在char myarray[4] = "abc"; 这是数组的初始化。 “晚期初始化”无法实现。

你应该记住这个规则。

我认为这是两个非常不同的案例。 在第一种情况下,在编译时分配和初始化存储器。 在第二个 – 在运行时。

 myarray = "abc"; 

…是指针指向myarray的“abc”指针。

这不是用“abc”填充myarray缓冲区。

如果你想手动填充myarray缓冲区,没有strcpy(),你可以使用:

 myarray[0] = 'a', myarray[1] = 'b', myarray[2] = 'c', myarray[3] = 0; 

要么

 char *ptr = myarray; *ptr++ = 'a', *ptr++ = 'b', *ptr++ = 'c', *ptr = 0; 

你的问题是关于指针和缓冲区(数组)之间的区别。 我希望你现在明白C如何解决各种问题。

这是另一个C示例,其中相同的语法具有不同的含义(在不同的地方)。 虽然人们可能会认为这两种情况的语法应该不同,但它就是这样。 这个想法并不是说“不允许”,而是第二件事意味着不同的东西(意思是“指针分配”)。