Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将指针设置为零';第四个地点?_C - Fatal编程技术网

C 如何将指针设置为零';第四个地点?

C 如何将指针设置为零';第四个地点?,c,C,据我所知,在预处理阶段,代码中出现的所有NULL都被0替换。然后在编译过程中,指针上下文中出现的所有0都将替换为相应的值,该值表示该计算机上的NULL。因此,编译器必须知道该特定机器的空值。 现在,这意味着每当我在指针上下文中使用0时,它都会被该计算机上表示NULL的适当值替换,该值可能是0,也可能不是0。那么,当我在指针上下文中使用0时,如何告诉编译器我实际上是指0而不是NULL呢? 对不起,描述得太长了。如果我错了,请纠正我一种方法是将所有位零存储到指针中: void* zero; mems

据我所知,在预处理阶段,代码中出现的所有NULL都被0替换。然后在编译过程中,指针上下文中出现的所有0都将替换为相应的值,该值表示该计算机上的NULL。因此,编译器必须知道该特定机器的空值。
现在,这意味着每当我在指针上下文中使用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 */