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

时间:2011-02-12 12:27:44

标签: c arrays char

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

char myarray[4];

myarray = "abc";

这是允许的:

char myarray[4] = "abc";

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

char myarray[4];

strcpy(myarray, "abc");

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

谢谢!

5 个答案:

答案 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)

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