例如:
char a[] = "abc\0";
标准C是否规定,即使字符串末尾已经有一个零值字节,也必须追加另一个值为0
的字节?因此,sizeof(a)
是4还是5?
指出与C字符串相关的一些细微差别。
字符数组sizeof将为5,但字符串通常被视为3个字符+1个空终止符。多余的空终止符不会被看到。
这是因为字符串被遍历直到第一个空终止符被遇到。这就是为什么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
char a[] = {'a','b','c','\0'};
。这不被声明为字符串字面值,因此不会自动追加额外的空字符来终止字符串。 - Coder_Danchar a[4] = "abc\0";
。 - nwellnhof