Pet*_*lin 3 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'};
Run Code Online (Sandbox Code Playgroud)
所以,扭曲实际上是在对代码的注释中描述的,有没有办法char[]用字符串文字初始化而不终止零?
更新:看起来IntelliSense确实是错误的,这种行为在C标准中明确定义.
Ric*_*ard 13
这个
char symbols[3] = "123";
Run Code Online (Sandbox Code Playgroud)
是一个有效的声明.
根据1988年的ANSI C规范:
字符类型数组可以由字符串文字初始化,可选地用大括号括起来.字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的成员.
因此,你所做的事情在技术上很好.
请注意,字符数组是初始化程序所述约束的例外:
初始化列表中不应有初始化器,而不是要初始化的对象.
但是,一段代码的技术正确性只是代码"善"的一小部分.该行将char symbols[3] = "123";立即打击资深程序员作为嫌疑人,因为它看起来是一个有效的字符串初始化,后来可能会被用作,导致意外错误和某些死亡.
如果你想走这条路,你应该确定这是你真正想要的.保存这个额外的字节是不值得的,这可能会让你陷入困境.NULL符号(如果有的话)允许您编写更好,更灵活的代码,因为它提供了一种明确的(在大多数情况下)终止数组的方法.
(此处提供的草案规范.)
为了在本页的其他地方选择Rudy的评论,C9草案规范在§6.7.8(第130页)中的第32个例子说明了这些线条
char s[] = "abc", t[3] = "abc";
Run Code Online (Sandbox Code Playgroud)
是完全相同的
char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };
Run Code Online (Sandbox Code Playgroud)
您可以从中推断出您正在寻找的答案.
可以在此处找到C99规范草案.