C语言 以空终止符结尾的字符串是否包含额外的空终止符?

mcdcgff0  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(194)

例如:

char a[] = "abc\0";

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

42fyovps

42fyovps1#

不管字符串的内容如何,所有字符串文本都有一个隐式空终止符。
标准(6.4.5字符串字面量)规定:
将值为零的字节或代码追加到由一个或多个字符串文本生成的每个多字节字符序列。
因此,字符串字面量"abc\0"除了包含显式的空终止符之外,还包含隐式的空终止符,因此,数组a包含5个元素。

jxct1oxe

jxct1oxe2#

指出一些与C字符串相关的细微差别。
字符数组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

相关问题