有人可以向我解释为什么int array[3] = {1,2,3}
可以工作但是
char array[3] = "123"
无效?
打印出来" 123(("而不是" 123"。
它表示对于char数组需要另一个空格用于空字符,但不是从0开始的数组,所以char array[3]
就足够了,因为它实际上是4个空格。除非char数组实际上需要2个空格,一个用于null,一个用于特殊字符。
答案 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]。