我正在阅读“编程实践”,它表示在C中按列表行走的标准循环是:
for (p=list;p != NULL;p=p->next)
...
我的问题是NULL如何工作?我自己在程序中使用过它,但从未停下来思考它是如何工作的。
我想,NULL必须是一个非常基本的头文件(如stdio.h)中定义的标准宏 但它被定义为什么?是吗?
#define MACRO 0
这里当我们将指针比较为0时0是如何工作的。这个0可能是一个有效的内存地址0,那么我们如何区分我们实际上是指无效地址,即指针有一个逻辑空值?
谢谢,
答案 0 :(得分:4)
C FAQ在NULL pointers上有一整节。简短摘要:
0
),在编译器知道指针的上下文中
需要,被视为“空指针”:已知不指向有效的指针值
记忆地址NULL
,可以是普通0
或
投入指针:((void *) 0)
(C标准允许)答案 1 :(得分:1)
它被定义为0,是的。问题是0 不是有效的内存地址;计算机实际上放在一起,以致试图访问该地址是一个错误。
如果您想坚持0是合法地址,请尝试在您的计算机上运行此程序:
#import <stdio.h>
int main() {
int *p = 0;
printf("No read error: %d\n", *p);
*p = 1;
printf("No write error either\n");
}