有人可以向我解释为什么 int array[3] = {1,2,3}
有效但是
char array[3] = "123"
不起作用?
它打印出“123( (”而不是“123”。
它说 char 数组需要另一个空间用于空字符,但数组不是从 0 开始的,所以 char array[3]
就足够了,因为它实际上是 4 个空间。除非 char 数组实际上需要 2 个空格,一个用于 null,一个用于特殊字符。
最佳答案
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'
不会被写入,因为没有空间。
当您在 printf
中使用 %s
打印时,它会调用 Undefined behavior as %s
打印 NUL 终止符之前的所有内容。因此,printf
继续从无效内存位置读取值,直到出现 '\0'
。当你这样做时,任何事情都可能发生。您可能会看到随机垃圾被输出、崩溃、段错误等。基本上,您永远不应该依赖这种行为,即使它看起来像预期的那样“有效”。
but doesn't array start from 0
是
so
char array[3]
is enough since it actually 4 space
错了。 char array[3]
的有效索引是
array[0]
array[1]
array[2]
访问 array[3]
是错误的,它调用了 Undefined Behavior .
使用
解决问题char array[4] = "123";
或更好:
char array[] = "123";
空括号告诉编译器确定数组的大小。
关于c - C 中的静态字符数组声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30296125/