这里写自定义目录标题
c语言取结构体的偏移量
ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,并且转换的结果是个NULL,因此((type *)0)的结果就是一个类型为type *的NULL指针.
其次,编译器对& 的处理上,进行了优化。
在计算机中,要访问一个地址空间,必先知道他的地址, 然后才访问该地址对应的空间;
编译器在会将&(( type *) 0)-> field优化为直接取地址,因为这种表达是: 先访问成员field的空间, 再取空间的地址,就相当于直接取地址。编译器在编译过程中直接优化为取field的地址。
#include<stdio.h>
struct Book
{
int nums;
int pages;
double prices;
};
int main(){
struct Book *b = NULL;
printf("%p\n", &b->prices);
printf("%d\n",(int) &b->prices);
printf("%ld\n",(long) &b->prices);
return 0;
}
/*输出*/
0x8
8
8
#include<stdio.h>
#define FPOS( type, field ) ( (long) &(( type *) 0)-> field )
struct Book
{
int nums;
int pages;
double prices;
};
int main(){
struct Book book;
book.nums=100;
book.pages = 500;
book.prices = 10.2f;
printf("%ld",FPOS(struct Book,pages));
return 0;
}