哪种语言标准允许忽略固定尺寸数组上的空终止器

What language standards allow ignoring null terminators on fixed size arrays?

本文关键字:数组 终止 语言标准 许忽略      更新时间:2023-10-16

我们将C代码转换为C 。
我注意到以下代码在C,

中得到了很好的定义。
int main(){
  //length is valid. '' is ignored
  char  str[3]="abc";
}

在数组初始化中所述:

"如果已知数组的大小,则可能比 字符串文字,在这种情况下,终止null字符为 被忽略。"

但是,如果我要在C 中构建相同的代码,我会收到以下C 错误:

error: initializer-string for array of chars is too long
[-fpermissive]    char  str[3]="abc";

我希望有人可以阐述。

问题:
代码示例在所有C语言标准中是否有效?
在所有C 语言标准中都无效吗?
是否有一个语言有效的原因,而不是另一种语言?

您在这里看到的是C和C 中CSTRING的初始化规则的区别。在C11§6.7.9/14中,我们有

字符类型的数组可以通过字符串字符串文字或utf -8字符串字面的字体初始化,该字符串在括号中封闭。字符串文字的连续字节(包括终止null字符,如果有空间或数组的大小未知)初始化数组的元素。

强调矿山

,只要数组足够大,可以将null终端的字符串大,就可以有效。所以

char  str[3]="abc";

是有效的C。在C 14中,但是在[dcl.init.string]/2状态中发现的规则

没有比数组元素更多的初始化器。

并继续证明以下代码是错误

char cv[4] = "asdf"; // error

因此,在C 中,您必须有足够的存储空间才能为整个字符串字面的字面字体(包括Null终结者)。

代码示例在所有C语言标准中是否有效?

请注意,一次只有一个ISO标准。C2011取代了C99,它已取代C89。

我相信它应该根据这些标准中的任何一个有效。

在所有C 语言标准中都无效吗?

与上面相同,只需将"有效"更改为"无效"。

有一个理由在一种语言中有效而不是另一种语言有效吗?

很可能在C中有效,以免打破任何依赖于行为的遗留代码。C 出现在C后大约十年左右,并试图解决C的某些缺点,这是被插入的漏洞之一。

许多现代编程语言是对早期语言的迭代和改进;C是具有类型系统的B,C 是C c具有OO支持和更好的类型安全性,Java和C#是C ,不确定的行为等。