当我try 编译以下代码时:

int main() {
    char a[4] = "1234";  // This string is length 5, no warning
    char b[4] = "12345"; // This string is length 6, produces a warning
}

我得到一个警告,关于"char数组的初始化器字符串太长",或者只有第二行是这样的.有人知道这是否是故意的吗?为什么第一个不会发出警告?我和GCC和叮当都试过了.

推荐答案

在与C++相反的C中,当字符串文字的终止零字符'\0'没有存储在初始化的数组中时,您可以用字符串文字来初始化具有固定大小的字符array.在这种情况下,数组将不包含字符串.

来自C标准(6.7.9初始化_

14字符类型的数组可以由字符串初始化 文本或utf−8字符串文本,可以 Select 用大括号括起来. Successive bytes of the string literal (including the terminating null character if there is room或如果数组的大小未知) initialize the elements of the array.

所以在这份声明中

char a[4] = "1234";

字符数组中没有空间容纳字符串文字的终止零字符'\0'.

至于这份声明

char b[4] = "12345";

那么它就打破了这样的要求

2任何初始值设定项都不应try 为非 包含在被初始化的实体中.

因为对于不包含在数组b中的字符使用了初始化器'5'(即不是终止零字符).

C++编译器将对这两个声明发出错误.

C++相关问答推荐

POSIX文件描述符位置

malloc实现:判断正确的分配对齐

Mise()在虚拟内存中做什么?

如何正确地索引C中的 struct 指针数组?

有没有更简单的方法从用户那里获取数据类型来计算结果

我编译了一个新的c程序,并收到以下错误

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

为什么我一直收到分段错误?

向上强制转换C中的数值类型总是可逆的吗?

在 struct 中强制转换空指针

Flose()在Docker容器中抛出段错误

X64:并发写入布尔数组

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

程序对大输入给出错误答案

在我的函数中实现va_arg的问题

将char*数组深度复制到 struct 中?

与指针的原始C数组或C++向量<;向量<;双>>;

在链表中插入一个值

当循环变量在溢出时未定义时,可以进行哪些优化?

使用 SDL2 的 C 程序中的内存泄漏