很多人以为 NULL == 0,但在 C 里,它们根本不是一回事。
1. 两个完全不同的东西
- 空指针常量:源码层面的
0或(void *)0 - 空指针:运行时、操作系统判定为无效地址的指针值
编译器会自动把空指针常量转为对应平台的空指针,但类型不一样。
2. 致命暗坑:变参函数传 NULL
printf("%s", 0); // 崩溃:传 int 0
printf("%s", NULL);// 正常:传指针空值
可变参数不做隐式转换,0 是整型,NULL 是指针,栈布局错位直接炸。
3. 隐蔽跨平台坑
32 位:指针 4 字节
64 位:指针 8 字节
直接写 int x = NULL;,64 位会截断高 4 字节,埋下随机崩溃。
极简安全规范
- 只包含
<stddef.h>再用 NULL - 指针判空只用:
if (p == NULL)/if (!p) - 永远不要把 NULL 赋值给整型变量