编码风格-在C语言中沿着列表行走的标准习惯用法



我正在读《编程实践》,它说在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");
}