\ 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结尾

看到这个链接看到一个工作的例子

注意,你声明strchar 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') ,即它知道要停止。