我遇到了一段代码,其中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;
}
答案 0 :(得分:1)
(正如评论中明确指出的那样,这个答案在技术上并不正确。但是,我保留这个答案,让你直截了当地了解发生了什么。)
获取任何变量&x
的地址x
实际上并不会评估x
。
专门针对指针foo *p
,&(*p)
不会取消引用p
。事实上,&(*p)
仅等于p
。
你的例子只是有点人为,因为它没有获得某些*p
(在你的情况下,p = (foo *) 0
)的地址,而是其中一个成员的地址。
但是,论证仍然存在:p->m
只是一个变量,获取该地址永远不会对变量本身进行评估。
您可以想象,#34;引擎盖&#34;,编译器只计算地址,直到您实际访问数据。从&x
获取地址永远不会访问该数据。