我正在读《编程实践》,它说在C中沿着列表行走的标准循环是:
for (p=list;p != NULL;p=p->next)
...
我的问题是NULL是如何工作的?我自己也在程序中使用过这一点,但从未停下来思考它是如何工作的。
我想,NULL必须是在stdio.h这样的非常基本的头文件中定义的标准宏但它的定义是什么?是吗?
#define MACRO 0
以下是当我们将指针与0进行比较时,0是如何工作的。这个0可能是一个有效的内存地址0,那么我们如何区分我们实际上指的是无效地址,即指针有一个逻辑空值?
谢谢,
C FAQ有一整节关于NULL指针。简要总结:
-
常量int值零(
0
),在编译器知道指针为需要,被视为"null指针":一个已知不指向有效指针的指针值存储器地址 - 这只适用于常量,而不适用于任何整数值;例如,将零分配给一个变量,然后将其用作指针,并不能保证该值空指针
- 实际地址可以是零,也可以不是零;编译器可以将它翻译成另一个地址
- 几个标准库标头将宏
NULL
定义为普通0
或强制转换为指针:((void *) 0)
(C标准允许两者之一)
它被定义为0,是的。问题是0是而不是一个有效的内存地址;计算机实际上是组装在一起的,所以试图访问那个地址是错误的。
如果您想坚持0是合法地址,请尝试在您的计算机上运行此程序:
#import <stdio.h>
int main() {
int *p = 0;
printf("No read error: %dn", *p);
*p = 1;
printf("No write error eithern");
}