请考虑以下代码:
char str[] = "Hello\0";
str数组的长度是多少,它的结尾是多少?
答案 0 :(得分:85)
sizeof str
是“Hello”文本的7 - 5个字节,加上显式NUL终止符,加上隐式NUL终止符。
strlen(str)
是5 - 仅五个“Hello”字节。
这里的关键是隐式nul终止符总是添加 - 即使字符串文字恰好以\0
结尾。当然,strlen
只是在第一个\0
停止 - 它无法区分。
隐式NUL终结符规则有一个例外 - 如果您明确指定数组大小,则字符串将被截断以适合:
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)
然而,这很少有用,并且容易错误计算字符串长度并最终导致未终止的字符串。它在C ++中也是禁止的。
答案 1 :(得分:10)
数组的长度为7,NUL字符\0
仍然计为字符,字符串仍然以隐式\0
请参阅this link查看工作示例
请注意,如果您将str
声明为char str[6]= "Hello\0";
,则长度将为6,因为只有在适合的情况下才会添加隐式NUL(在此示例中它不能。)
§6.7.8/ p14一系列 字符类型可以由a初始化 字符串文字,可选 用括号括起来。逐次 字符串的字符 字面意义(包括终止 空字符如果有空间或如果 该数组的大小未知) 初始化数组的元素。
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 */
答案 2 :(得分:5)
按照 JUST TRY IT 的常规鼓声独奏,以下是您将来如何回答类似的问题:
$ 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的字符串仅为"-->%s<---\n"
,而全局字符串分为两部分:"Hello"
和""
。 GNU汇编程序也终止了带有隐式NUL
字符的字符串,因此第一个字符串(.LC0)位于这两个部分的事实表明有两个NUL
s。因此字符串长7个字节。通常,如果你真的想知道你的编译器在使用某些代码块时做了什么,请将它隔离在这样的虚拟示例中,并使用-S
查看它正在做什么(对于GNU - MSVC也有一个标记用于汇编程序输出,但我不知道它的副手)。您将学到很多关于代码如何工作(或根据具体情况无法工作)的知识,并且您将得到快速得到的答案,100%保证与您正在使用的工具和环境相匹配。
答案 3 :(得分:5)
具体来说,我想提一个你可能会混淆的情况。
&#34; \ 0&#34;有什么区别?和&#34;&#34;?
答案是数组"\0"
代表{0 0}
,""
代表{0}
。
因为"\0"
仍然是字符串文字,并且还会在其末尾添加"\0"
。 ""
为空,但也添加了"\0"
。
了解这一点有助于您深入理解"\0"
。
答案 4 :(得分:3)
str数组的长度是多少,它的结尾是多少?
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;
}
答案 5 :(得分:0)
char str[]= "Hello\0";
那将是7个字节。
在内存中应该是:
48 65 6C 6C 6F 00 00
H e l l o \0 \0
编辑:
C字符串中的\ 0符号是什么意思?
这是字符串的“结尾”。空字符。在内存中,它实际上是零。通常,处理char数组的函数会查找此字符,因为这是消息的结尾。我将在最后举例。
str数组的长度是多少? (在编辑部分之前回答)
7
,它以多少个0结尾?
您的数组有两个零个“空格”。 str [5] = str [6] ='\ 0'= 0
其他示例:
假设您有一个打印该文本数组内容的函数。
您可以将其定义为:
char str[40];
现在,您可以更改该数组的内容(我不会详细介绍如何操作),以便它包含以下消息:“这只是打印测试” 在内存中,您应该具有以下内容:
54 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00
因此,您打印该char数组。然后,您想要一条新消息。比方说“你好”
48 65 6c 6c 6f 00 73 20 6a 75 73 74 20 61 20 70 72 69 6e 74
69 6e 67 20 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00
注意str [5]上的00。这样,即使矢量和整个内容的实际经度不同,打印功能也将知道实际需要发送多少。
答案 6 :(得分:0)
'\0' 被称为 NULL 字符或 NULL 终止符 它是整数 0(零)的字符等价物,因为它不指代任何东西
在 C 语言中,它通常用于标记字符串的结尾。 示例字符串 a="砷"; 存储在数组中的每个字符
a[0]=A
a[1]=r
a[2]=s
a[3]=e
a[4]=n
a[5]=i
a[6]=c
数组末尾包含 ''\0' 以停止为字符串 'a' 分配数组内存。