C中的静态字符数组声明

时间:2015-05-18 06:07:13

标签: c arrays char

有人可以向我解释为什么int array[3] = {1,2,3}可以工作但是 char array[3] = "123"无效?

打印出来" 123(("而不是" 123"。

它表示对于char数组需要另一个空格用于空字符,但不是从0开始的数组,所以char array[3]就足够了,因为它实际上是4个空格。除非char数组实际上需要2个空格,一个用于null,一个用于特殊字符。

2 个答案:

答案 0 :(得分:6)

int array[3] = {1,2,3}

分配一个最多可以容纳3个整数的数组,你可以使用以下方法访问它们中的任何一个:

array[0]
array[1]
array[2]

下面:

char array[3] = "123"

"123"由4个字节组成。字符串文字中的字符以NUL终结符结尾。但是你分配3个字节,并且最多可以容纳2个字符(NUL终止符为+1)。因此,当您使用它初始化数组时,'\0'不会被写入,因为没有空格。

当您使用%s中的printf打印时,会调用Undefined behavior,因为%s会打印所有内容,直到NUL终止符。因此,printf继续从无效的内存位置读取值,直到'\0'。当你这样做时,任何事情都可能发生。您可能会看到随机垃圾输出,崩溃,分段错误等。基本上,您永远不应该依赖此行为,即使它似乎有"工作"如预期的那样。

  

但是没有数组从0开始

  

所以char array[3]就足够了,因为它实际上是4个空格

错误。 char array[3]的有效索引是

array[0]
array[1]
array[2]

访问array[3]是错误的,它会调用Undefined Behavior

使用

解决问题
char array[4] = "123";

或更好:

char array[] = "123";

空括号告诉编译器确定数组的大小。

答案 1 :(得分:3)

在c中声明一个数组时,char数组[3]将产生3个字符而不是4个字符,就像你在问题中所建议的那样。在字符串的末尾需要空字符,因此在这种情况下需要char数组[4]。