c - C 中的静态字符数组声明

标签 c arrays char

有人可以向我解释为什么 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/

相关文章:

java - 如何根据一列对一维(或二维)数组(多维)进行排序?

C++ 数组传递参数

c - 在c中获取输入字符的ASCII值

c - 链表节点的大小

arrays - Go 如何保证元素指针对数组和 slice 有效?

c - 记住最后执行的命令的简单历史记录

c++ - 多字符字符常量变量的值是多少

指示发生错误的通用字符

c++ - 如何使用 Turbo C++ 编译器配置 eclipse CDT

结合参数 getopt 的选项