\ 0符号在Cstring中的含义是什么?
考虑下面的代码:
char str[]= "Hello\0";
str数组的长度是多less,结束多less个零?
对于“Hello”文本, sizeof str
是7到5个字节,加上显式的NUL终止符,加上隐式的NUL终止符。
strlen(str)
是5 – 只有五个“Hello”字节。
这里的关键是隐式的nul终止符总是被添加 – 即使string刚刚恰好以\0
结尾。 当然, strlen
刚刚停在第一个\0
– 它不能分辨出来。
隐式NUL终结者规则有一个例外 – 如果你明确指定了数组的大小,那么这个string将被截断以适应:
char str[6] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 6 (with one NUL) char str[7] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 7 (with two NULs) char str[8] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 8 (with three NULs per C99 6.7.8.21)
然而,这很less有用,并且容易错误地计算string长度并以未终止的string结束。 这在C ++中也是被禁止的。
数组的长度是7,NUL字符\0
仍然被视为一个字符,string仍然以隐式\0
结尾
看到这个链接看到一个工作的例子
注意,你声明str
为char str[6]= "Hello\0";
长度将是6,因为隐式的NUL只能在适合的时候被添加(在这个例子中它不能)。
§6.7.8 / p14
字符types的数组可以由string文字初始化,可选地用大括号括起来。 string文字的后续字符(包括终止空字符, 如果有空间或数组未知大小)初始化数组的元素。
例子
char str[] = "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */ char str[5]= "Hello\0"; /* sizeof == 5, str is "Hello" with no NUL (no longer a C-string, just an array of char). This may trigger compiler warning */ char str[6]= "Hello\0"; /* sizeof == 6, Explicit NUL only */ char str[7]= "Hello\0"; /* sizeof == 7, Explicit + Implicit NUL */ char str[8]= "Hello\0"; /* sizeof == 8, Explicit + two Implicit NUL */
在我的平常鼓独奏的鼓励它 ,这里是如何回答这样的未来的问题:
$ cat junk.c #include <stdio.h> char* string = "Hello\0"; int main(int argv, char** argc) { printf("-->%s<--\n", string); } $ gcc -S junk.c $ cat junk.s
消除不必要的部分…
.LC0: .string "Hello" .string ""
…
.LC1: .string "-->%s<--\n"
…
请注意,我用于printf的string只是"-->%s<---\n"
而全局string分为两部分: "Hello"
和""
。 GNU汇编器也终止带有隐式NUL
字符的string,所以第一个string(.LC0)在这两个部分中的事实表明有两个NUL
。 该string因此是7个字节长。 一般来说,如果你真的想知道你的编译器正在做什么用一定的代码,隔离它在这样一个虚拟的例子,看看它在做什么使用-S
(对于GNU – MSVC也有一个标志,汇编输出,但我不知道它的副手)。 你会学到很多关于你的代码是如何工作的(或者根据情况不能工作),你会很快得到一个答案,100%保证与你工作的工具和环境相匹配。
str数组的长度是多less,结束多less个零?
让我们来看看:
int main() { char str[] = "Hello\0"; int length = sizeof str / sizeof str[0]; // "sizeof array" is the bytes for the whole array (must use a real array, not // a pointer), divide by "sizeof array[0]" (sometimes sizeof *array is used) // to get the number of items in the array printf("array length: %d\n", length); printf("last 3 bytes: %02x %02x %02x\n", str[length - 3], str[length - 2], str[length - 1]); return 0; }
具体来说,我想提一下你可能会混淆的一种情况。
“\ 0”和“”之间有什么区别?
答案是数组中的"\0"
表示为{0 0}
, ""
为{0}
。
由于"\0"
仍然是一个string文字,它也会在其末尾添加"\0"
。 和""
是空的,但也添加"\0"
。
了解这将帮助你深入理解"\0"
。
char str[]= "Hello\0";
在这个例子中, str
数组的大小是7
因为string定义了比数组可以容纳的多一个字符(终止'\0'
)。
_______ _______ _______ _______ _______ _______ _______ | | | | | | | | | 'H' | 'e' | 'l' | 'l' | 'o' | '\0' | '\0' | |_______|_______|_______|_______|_______|_______|_______|
'\0'
是空终止字符 。 它标志着string的结尾。 没有它,计算机无法知道这个angular色组有多长。 当你打印或复制一个string时,它只是保持打印或复制字符,直到find空字符('\ o') ,即它知道要停止。