查看结构体成员的大小和偏移地址的方法

来源:互联网 发布:威克姆阿贝女校知乎 编辑:程序博客网 时间:2024/05/22 01:38

 

这个是不小心被我撞见的,看到#define宏定义比较特别,仔细看了一下,发现原来有如此作用(请不要怪我少见多怪哦)。
自己编写一小程序试之,贴出代码与运行结果与大家共享。

代码:
#include  #define PACKVALUE 4#pragma pack(push)#pragma pack(PACKVALUE)        typedef struct{        char sa;        double sb;        int sc;} innerS; typedef struct{        int a;        char b;        short c;        innerS d[2];} testS; #pragma pack(pop) typedef unsigned long dword; #define FSIZE(type, field) sizeof(((type*)0)->field)#define FPOS(type, field) ((dword) & ((type*)0)->field) int main(void){        printf("#pragma pack(%d):/nsizeof(char)=%d; sizeof(short)=%d; sizeof(int)=%d; sizeof(double)=%d/n/n",                        PACKVALUE, sizeof(char), sizeof(short), sizeof(int), sizeof(double));         printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, a), FPOS(testS, a));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, b), FPOS(testS, b));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, c), FPOS(testS, c));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d), FPOS(testS, d));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d[0]), FPOS(testS, d[0]));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d[0].sa), FPOS(testS, d[0].sa));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d[0].sb), FPOS(testS, d[0].sb));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d[0].sc), FPOS(testS, d[0].sc));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d[1]), FPOS(testS, d[1]));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d[1].sa), FPOS(testS, d[1].sa));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d[1].sb), FPOS(testS, d[1].sb));        printf("FSIZE = %d, FPOS = %d/n", FSIZE(testS, d[1].sc), FPOS(testS, d[1].sc));        return 0;}

 

看来这是一个很不错的用来研究结构体对齐问题的辅助工具,比我上一次自己编写的那个查看内存的函数好用很多。


不过对于#define FPOS(type,field) ((dword) & ((type*) 0)->field)是如何实现的还是不懂,还望高人指点。