\0 在 C 语言里
\0 叫空字符(null character)
ASCII 值:0
写法:转义字符,反斜杠 + 数字0
作用:C 风格字符串的结束标记
区分:数字
0、字符'0'、\0是三样东西
0:整数 0'0':字符0,ASCII 是 48'\0':空字符,ASCII 是 0
例子
char str[] = "abc";
内存里实际存的是:'a' 'b' 'c' '\0'C 的字符串必须靠 \0 告诉函数(printf、strlen):字符串到这里结束了。
char str[5] = {'h','i','\0'};读到 \0 就停止。
点
strlen不算\0的长度"abc"的 strlen 结果是 3,不是4;如果少了
\0,就是没有结束符,printf 会继续往后乱读内存,乱码、越界;宏
NULL本质也是 0(指针用),和'\0'不是一回事,不要混。
题
\0 是空字符,ASCII码为0,作为C字符串的结束标志。
下面给你几段简单的C代码,演示 \0 的作用。
C语言没有专门的字符串类型,字符数组 +
\0才是C字符串,\0标记字符串末尾。
示例1:正常带 \0 的字符串
#include <stdio.h>
#include <string.h>
int main(void)
{
// "" 自动在末尾补上 \0
char s1[] = "abc";
printf("s1 = %s\n", s1);
printf("strlen(s1) = %zu\n", strlen(s1));
// 打印每个字符的ASCII
for (int i = 0; i < 4; i++)
{
printf("s1[%d] = %d\n", i, s1[i]);
}
return 0;
}内存存储:'a'(97) , 'b'(98) , 'c'(99) , '\0'(0)输出:
s1 = abc strlen(s1) = 3 s1[0] = 97 s1[1] = 98 s1[2] = 99 s1[3] = 0
strlen 遇到 \0 停止计数,不把 \0 算进长度。
示例2:手动构造字符数组,不加 \0(错误示范)
#include <stdio.h>
int main(void)
{
// 只有 a b c,没有结束符 \0
char s2[] = {'a', 'b', 'c'};
printf("%s\n", s2);
return 0;
}问题:没有 \0,printf 不知道哪里结束,会继续向后读取随机内存,输出乱码(缓冲区溢出)。
示例3:手动加上 '\0',变成合法字符串
#include <stdio.h>
int main(void)
{
char s3[] = {'a', 'b', 'c', '\0'};
printf("%s\n", s3);
return 0;
}输出:abc,正常。
示例4:中途放一个 \0,截断字符串
#include <stdio.h>
int main(void)
{
char s4[] = "hello";
s4[2] = '\0'; // 在第2号位置放上结束符
printf("%s\n", s4);
return 0;
}原本:h e l l o \0修改后:h e \0 l l o \0printf 读到 \0 就停下
输出:he
总结
\0 是空字符,ASCII=0;printf、strlen 等库函数读到 \0,就认为字符串到此结束。