Char数组初始化困境

标签 c arrays initialization initializer

考虑以下代码:

// hacky, since "123" is 4 chars long (including terminating 0)
char symbols[3] = "123";

// clean, but lot of typing
char symbols[3] = {'1', '2', '3'};

所以,twist 实际上在代码的注释中进行了描述,有没有办法用不以零结尾的字符串文字来初始化 char[]

更新:似乎 IntelliSense 确实是错误的,这种行为在 C 标准中明确定义。

最佳答案

这个

char symbols[3] = "123";

是一个有效的声明。

根据 1988 年的 ANSI C 规范:

An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the members of the array.

因此,您所做的在技术上是没问题的。

请注意,字符数组是声明的初始化器约束的一个异常(exception):

There shall be no more initializers in an initializer list than there are objects to be initialized.

然而,一段代码的技术正确性只是该代码“好”的一小部分。 char symbols[3] = "123"; 这行会立即让资深程序员产生怀疑,因为从表面上看,它似乎是一个有效的字符串初始化,以后可以这样使用,导致意外错误和死亡。

如果你想走这条路,你应该确定它是你真正想要的。节省那个额外的字节是不值得的,这可能会让您陷入困境。 NULL 符号(如果有的话)允许您编写更好、更灵活的代码,因为它提供了一种明确的(在大多数情况下)终止数组的方式。

(规范草案可用 here .)

为了在本页其他地方采用 Rudy 的评论,C99 规范草案第 32 条示例在 §6.7.8(第 130 页)中指出行

char s[] = "abc", t[3] = "abc";

相同
char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };

您可以从中推断出您正在寻找的答案。

可以找到 C99 规范草案 here .

关于Char数组初始化困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6915737/

相关文章:

c - 尝试释放内存会导致错误

c 编程 getchar 和 EOF 的含义是什么以及这段代码的作用我不明白

Java数组对象初始化

c - 将指定的初始值设定项与未命名的嵌套数据类型一起使用

c - 修复 C switch 语句函数溢出?

c - 不兼容的指针类型

arrays - 为什么我的 Ruby 方法返回一个数组而不是字符串?

javascript - 如何在 native 客户端和 javascript 中来回发送数组缓冲区

arrays - 将目录时间戳插入 bash 中按日期排序的数组

laravel - 如何在 Livewire 重新渲染后重新初始化 AlpineJS 组件?