为什么在这种情况下NULL取消引用不会导致未定义的行为

时间:2016-09-09 11:05:39

标签: c pointers structure

我遇到了一段代码,其中NULL是对结构指针类型(foo *) 0的类型转换,并且该指针取消引用成员((foo *)0)->m),并使用该&(((foo *)0)->m))的地址并键入将其转换为整数以获取该成员在结构中的内存索引。((unsigned int)(&(((foo *)0)->m)))

我也看到这个宏具有通过给出索引一直给出偏移量的特定行为。请尝试帮助启发我。谢谢输入。

#include <stdio.h>
#define  MACRO(m) ((unsigned int)(&(((foo *)0)->m)))

typedef struct
{
int a;
int b;
int c;
int d;
}foo;

int main(void) {
    printf("\n  %d  ", MACRO(c));
    return 0;
}

1 个答案:

答案 0 :(得分:1)

(正如评论中明确指出的那样,这个答案在技术上并不正确。但是,我保留这个答案,让你直截了当地了解发生了什么。)

获取任何变量&x的地址x实际上并不会评估x

专门针对指针foo *p&(*p)不会取消引用p。事实上,&(*p)仅等于p

你的例子只是有点人为,因为它没有获得某些*p(在你的情况下,p = (foo *) 0)的地址,而是其中一个成员的地址。 但是,论证仍然存在:p->m只是一个变量,获取该地址永远不会对变量本身进行评估。

您可以想象,#34;引擎盖&#34;,编译器只计算地址,直到您实际访问数据。从&x获取地址永远不会访问该数据。