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

本文通过一个具体的C语言示例程序,深入探讨了结构体成员的对齐方式及其对内存布局的影响。通过使用#pragma pack指令及自定义宏,展示了如何控制结构体内部的数据对齐,并分析了不同类型的字段在内存中的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#include <stdio.h>

#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)是如何实现的还是不懂,还望高人指点。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值