C 如何将指针设置为零';第四个地点?
据我所知,在预处理阶段,代码中出现的所有NULL都被0替换。然后在编译过程中,指针上下文中出现的所有0都将替换为相应的值,该值表示该计算机上的NULL。因此,编译器必须知道该特定机器的空值。C 如何将指针设置为零';第四个地点?,c,C,据我所知,在预处理阶段,代码中出现的所有NULL都被0替换。然后在编译过程中,指针上下文中出现的所有0都将替换为相应的值,该值表示该计算机上的NULL。因此,编译器必须知道该特定机器的空值。 现在,这意味着每当我在指针上下文中使用0时,它都会被该计算机上表示NULL的适当值替换,该值可能是0,也可能不是0。那么,当我在指针上下文中使用0时,如何告诉编译器我实际上是指0而不是NULL呢? 对不起,描述得太长了。如果我错了,请纠正我一种方法是将所有位零存储到指针中: void* zero; mems
现在,这意味着每当我在指针上下文中使用0时,它都会被该计算机上表示NULL的适当值替换,该值可能是0,也可能不是0。那么,当我在指针上下文中使用0时,如何告诉编译器我实际上是指0而不是NULL呢?
对不起,描述得太长了。如果我错了,请纠正我一种方法是将所有位零存储到指针中:
void* zero;
memset(&zero, 0, sizeof(zero));
在C语言中,没有可移植的方法来实现这一点。C语言没有提供专门用于将指针指向特定数字地址的可移植特性。然而,显式整数到指针转换的“秘密”意图实际上只是:实现整数和指针之间的“自然”映射,其中“自然”通常意味着整数的数值在转换为指针类型时保持不变(如果可能)。换句话说,您只需要一个值为
0
的整数。您只需要确保这个整数不符合整型常量表达式的条件,否则它将被识别为空指针常量。(简单地说,您需要运行时整数零,而不是编译时整数零)
比如说这个,
uintptr_t i = 0;
void *p = (void *) i;
通常会产生一个指向地址0
的指针。此外,在C语言(与C++相反)中
通常还会产生一个指向地址0
的指针。而这
void *p = 0; /* compile-time 0 will not do */
将生成特定于实现的空指针值
你也可以看看C FAQ,它涵盖了这个问题。巧妙的技巧-除了在大多数系统上,当他变为*零时,这会发生爆炸。除非他足够幸运,能够在一台非零NULL的机器上工作(正如我过去所做的;NULL是0xffffff,所以你可以很高兴地做*zero,看看地址0是什么)。在大多数系统上,像这样使用
memset
是毫无意义的,因为只需分配zero=NULL
,就可以得到相同的结果—零地址和NULL指针是一样的。但是当零不是空指针,并且需要在程序中硬编码地址时,这可能会很有用。
void *p = 0; /* compile-time 0 will not do */