C语言中NULL和空字符的区别是什么

来源:这里教程网 时间:2026-02-21 16:52:05 作者:

NULL与空字符:指针的幽灵和字符的虚无

你可能会觉得

NULL
和空字符(
\0
)都是表示“什么都没有”,但实际上它们在C语言的世界里是截然不同的存在,就像幽灵和虚无,一个指引方向,一个占据空间。搞不清它们的区别,你的代码可能会在运行时悄无声息地崩溃,留下让你抓耳挠腮的bug。

让我们先从最基本的开始。

NULL
是一个宏,通常定义为
(void *)0
,它表示一个无效的指针。记住,指针是内存地址,
NULL
指明这个指针不指向任何有效的内存位置。你试图访问
NULL
指针指向的内存,系统会毫不犹豫地给你一个段错误(segmentation fault)。

空字符

\0
,ASCII码值为0,是一个字符常量。它占据一个字节的空间,虽然看起来什么也没有,但它在字符串中扮演着至关重要的角色:标志着字符串的结尾。C语言的字符串处理函数,例如
strlen
,正是依靠空字符来判断字符串的长度。

关键的区别在于:

NULL
用于指针,而
\0
用于字符数组(字符串)。它们是不同类型的数据,根本不能混用。把
NULL
赋值给一个字符变量,或者把
\0
赋值给一个指针,都是编译器会警告你甚至直接报错的错误操作。

立即学习“C语言免费学习笔记(深入)”;

让我们用代码来说明:

<code class="c">#include <stdio.h>
int main() {
    char *ptr = NULL; // ptr is a pointer initialized to NULL
    char str[] = "Hello\0World"; // str is a character array, '\0' terminates the string "Hello"
    printf("ptr: %p\n", ptr); // Print the memory address pointed to by ptr (should be NULL)
    // Attempting to access memory pointed to by ptr would lead to a crash.
    // printf("Value at ptr: %c\n", *ptr);  //  Uncomment this to see the crash!

    printf("str: %s\n", str); // Prints "Hello" because '\0' stops the string printing.
    printf("Length of str: %zu\n", strlen(str)); // Prints 5, the length of "Hello"
    char emptyChar = '\0';
    printf("Size of emptyChar: %zu bytes\n", sizeof(emptyChar)); // Prints 1, showing it occupies memory.
    return 0;
}</code>

这段代码展示了

NULL
\0
的用法,并强调了它们的区别。
ptr
是一个指向
NULL
的指针,试图访问它指向的内存会导致程序崩溃。而
str
是一个包含空字符的字符数组,
\0
正确地终止了字符串"Hello",使
strlen
函数能够正确地计算字符串长度。
emptyChar
则展示了空字符本身占据内存空间的事实。

性能与最佳实践:

在处理字符串时,务必确保字符串以

\0
结尾。忘记添加
\0
会导致字符串处理函数行为异常,甚至程序崩溃。 在使用指针之前,务必检查其是否为
NULL
,避免访问无效内存。这在动态内存分配(例如
malloc
)后尤其重要。

踩坑经验:

我曾经因为没有检查指针是否为

NULL
而导致程序崩溃无数次。 在处理用户输入的字符串时,一定要小心处理字符串长度,防止缓冲区溢出。 记住,
NULL
指针和空字符虽然看起来相似,但它们在C语言中扮演着完全不同的角色,混淆它们的后果不堪设想。 养成良好的编程习惯,仔细检查指针和字符串的有效性,才能写出健壮、可靠的C语言程序。

相关推荐