【问题标题】:Do string literals that end with a null-terminator contain an extra null-terminator?以空终止符结尾的字符串文字是否包含额外的空终止符?
【发布时间】:2013-07-30 09:37:42
【问题描述】:

例如:

char a[] = "abc\0";

标准 C 是否规定必须附加另一个值 0 的字节,即使字符串末尾已经有一个零?那么,sizeof(a) 等于 4 还是 5?

【问题讨论】:

  • 您的问题中的英文绝对没有问题。但是你不能通过简单的尝试找到答案吗?
  • 如果你想明确一点,你可以写:char a[] = {'a','b','c','\0'};。这未声明为字符串文字,因此不会附加额外的终止 null。
  • 或者,你可以写char a[4] = "abc\0";
  • 后者可能看起来有点错误,因为标准说附加了一个额外的 '\0' 使字符串文字大小为 5 个字符,因此对于 4 字符数组来说似乎太大了。但是,如果初始化程序对于固定大小的数组来说太大了,多余的元素将被简单地忽略/不用于初始化(第 6.7.8 节第 14 段),这在这种情况下是可以的,但我会避免这样写。

标签: c string standards


【解决方案1】:

所有字符串文字都有一个隐含的空终止符,与字符串的内容无关。

标准(6.4.5 字符串文字)说:

一个字节或零值代码被附加到每个由一个或多个字符串文字产生的多字节字符序列。

因此,字符串文字"abc\0" 除了显式的外,还包含隐式的空终止符。因此,数组a 包含 5 个元素。

【讨论】:

  • '所以,数组 a 包含 5 个元素。'你的意思是4 元素吗?
  • @BikalGurung:不,5 是正确的。 {'a', 'b', 'c', '\0', '\0'}
  • C 中的隐式空终止符有一个例外,例如char s[3] = "abc"; 在这里,s 不会有空终止符。 (顺便说一句,这将是 C++ 中的编译错误)。见this answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多