据我所知,在预处理阶段,代码中所有出现的NULL都被0替换。然后在编译期间,指针上下文中所有出现的0都被替换为在该机器上表示NULL的适当值。因此编译器必须知道该特定机器的NULL值 现在,这意味着每当我在指针上下文中使用0时,它就会被该机器上表示NULL的适当值替换,该值可能是也可能不是0.那么,我怎么能告诉编译器我实际上是指0而不是NULL ,当我在指针上下文中使用0时? 很抱歉有很长的描述。如果我错了,请纠正我
答案 0 :(得分:5)
一种方法是将all-bits-zero存储到指针中:
void* zero;
memset(&zero, 0, sizeof(zero));
答案 1 :(得分:3)
嗯,C中没有可移植的方法来实现这一点.C语言没有提供专门用于瞄准指向特定数字地址的指针的便携式功能。然而,显式整数到指针转换的“秘密”意图实际上就是:实现整数和指针之间的“自然”映射,其中“自然”通常意味着整数的数值保持不变(如果可能)将其转换为指针类型。换句话说,您只需要一个0
值的整数。您只需要确保此整数不符合积分常量表达式,否则它将被识别为空指针常量。 (简单来说,您需要一个运行时积分零,而不是编译时积分零)。
例如,这个
uintptr_t i = 0;
void *p = (void *) i;
通常会产生一个指向地址0
的指针。而且,在C语言(而不是C ++)中这个
const uintptr_t i = 0;
void *p = (void *) i;
通常也会产生一个指向地址0
的指针。虽然这个
void *p = 0; /* compile-time 0 will not do */
将生成特定于实现的空指针值。
您还可以查看C FAQ here,其中涵盖了这个问题。