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

问题描述 投票:0回答:2

例如:

char a[] = "abc\0";

标准 C 是否表示即使字符串末尾已经有一个零,也必须附加另一个值

0
的字节?那么,
sizeof(a)
等于4还是5?

c string standards
2个回答
77
投票

无论字符串的内容如何,所有字符串文字都有一个隐式空终止符。

标准(6.4.5 String Literals)说:

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

因此,字符串文字

"abc\0"
除了显式空终止符外,还包含隐式空终止符。所以,数组
a
包含5个元素。


0
投票

指出与 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
© www.soinside.com 2019 - 2024. All rights reserved.