例如:
char a[] = "abc\0";
标准 C 是否表示即使字符串末尾已经有一个零,也必须附加另一个值
0
的字节?那么,sizeof(a)
等于4还是5?
无论字符串的内容如何,所有字符串文字都有一个隐式空终止符。
标准(6.4.5 String Literals)说:
一个字节或值为零的代码附加到每个多字节字符序列,该字符序列由一个或多个字符串文字产生。
因此,字符串文字
"abc\0"
除了显式空终止符外,还包含隐式空终止符。所以,数组a
包含5个元素。
指出与 C 字符串相关的一些细微差别。
char 数组 sizeof 将为 5,但字符串通常将“视为”3 个字符 + 1 个空终止符。不会看到额外的空终止符。
这是因为遍历字符串直到遇到 FIRST 空终止符。这就是为什么 strlen 将是 3 而不是 4。这 3 个字母被计算在内,当它遇到表示字符串结尾的空终止符时,它就会停止。
当将 char[] 传递给函数时,它将衰减为 char*,因此原始 char[] 的大小为 5 的事实进一步丢失。
但是...如果您将
sizeof(a)
传递给函数,那么额外的 null 可能会导致问题,当然不应包含在字符串文字中。
#include <string.h>
#include <stdio.h>
void main() {
char a[] = "abc\0";
printf("sizeof: %lu\n", sizeof(a));
printf("strlen: %lu\n", strlen(a));
}
输出:
sizeof: 5
strlen: 3