我很好奇为什么在C中不允许这样做:
char myarray[4];
myarray = "abc";
这是允许的:
char myarray[4] = "abc";
我知道在第一种情况下我应该使用 strcpy :
char myarray[4];
strcpy(myarray, "abc");
但是为什么不允许声明和后来的初始化,允许声明和同步初始化?它与C程序的内存映射有关吗?
谢谢!
答案 0 :(得分:37)
那是因为你的第一个代码段没有执行初始化,而是赋值:
char myarray[4] = "abc"; // Initialization.
myarray = "abc"; // Assignment.
并且数组不能直接在C中分配。
名称myarray
实际上解析为其第一个元素(&myarray[0]
)的地址,该元素不是lvalue,因此不能作为作业的目标。
答案 1 :(得分:4)
是的,这是语言中的一种不一致。
myarray = "abc";
中的“=”是赋值(由于数组基本上是一种常量指针,因此不起作用),而在char myarray[4] = "abc";
中,它是数组的初始化。 “晚期初始化”无法实现。
你应该记住这条规则。
答案 2 :(得分:1)
myarray = "abc";
...是将指针“abc”指定给指针myarray。
这不是用“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如何解决各种问题。
答案 3 :(得分:1)
这是另一个C示例,其中相同的语法具有不同的含义(在不同的地方)。虽然人们可能会认为这两种情况的语法应该不同,但它就是这样。这个想法不是说“不允许”,而是第二件事意味着不同的东西(意思是“指针分配”)。
答案 4 :(得分:0)
我认为这是两个截然不同的案例。在第一种情况下,在编译时分配和初始化存储器。在第二个 - 在运行时。