查看结构体成员的大小和偏移地址的方法
来源:互联网 发布:威克姆阿贝女校知乎 编辑:程序博客网 时间: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)是如何实现的还是不懂,还望高人指点。
- 查看结构体成员的大小和偏移地址的方法
- 查看结构体成员的大小和偏移地址的方法
- 计算结构体成员偏移地址的一种方法
- 结构体成员地址在结构体内的偏移
- 如何计算结构体大小和结构体中成员的内存偏移
- 如何获取结构体某成员的偏移地址
- 如何获取结构体某成员的偏移地址
- 如何获取结构体某成员的偏移地址
- 结构体成员偏移地址
- C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节
- 求结构体成员偏移量的三种方法
- 如何求结构体成员的偏移地址 || 结构体的 sizeof 总结
- 得到结构体中成员的偏移
- 求结构体成员的偏移量
- 结构体成员变量的偏移值
- 结构体成员偏移量的计算
- 获取成员变量的地址和偏移地址
- 如何求出C语言结构体中各个成员的大小及内存偏移量
- 删除惹眼的未知帐户 在设置共享时 共享和安全里
- 国内十大人才短缺职位以“技术人员”居首
- Excel vba编程实例 源码
- 网址收藏
- Introduce of myself
- 查看结构体成员的大小和偏移地址的方法
- 用心管理情绪
- EMC-CBR故障诊断研究(四)
- 何.谓.成.功
- 控制面板程序(CPL)调试方法
- 更新数据库字段部分内容
- 使用XMANAGER 联接LINUX 后使用SQLPLUS 不能使用BACKSPACE 回格键.
- 更新数据库字段部分内容
- 新东方