沿着C列表行走的标准习语

时间:2011-05-28 13:07:34

标签: c coding-style linked-list idioms

我正在阅读“编程实践”,它表示在C中按列表行走的标准循环是:

for (p=list;p != NULL;p=p->next)
...

我的问题是NULL如何工作?我自己在程序中使用过它,但从未停下来思考它是如何工作的。

我想,NULL必须是一个非常基本的头文件(如stdio.h)中定义的标准宏 但它被定义为什么?是吗?

#define MACRO 0  

这里当我们将指针比较为0时0是如何工作的。这个0可能是一个有效的内存地址0,那么我们如何区分我们实际上是指无效地址,即指针有一个逻辑空值?

谢谢,

2 个答案:

答案 0 :(得分:4)

C FAQ在NULL pointers上有一整节。简短摘要:

  • 常量 int值零(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");
}