如何设置指向零位的指针?

时间:2010-03-09 23:44:36

标签: c

据我所知,在预处理阶段,代码中所有出现的NULL都被0替换。然后在编译期间,指针上下文中所有出现的0都被替换为在该机器上表示NULL的适当值。因此编译器必须知道该特定机器的NULL值 现在,这意味着每当我在指针上下文中使用0时,它就会被该机器上表示NULL的适当值替换,该值可能是也可能不是0.那么,我怎么能告诉编译器我实际上是指0而不是NULL ,当我在指针上下文中使用0时? 很抱歉有很长的描述。如果我错了,请纠正我

2 个答案:

答案 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,其中涵盖了这个问题。

相关问题