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


[原文: http://www.cnitblog.com/shosh/archive/2008/05/06/posizeOfStruct.html ]

这个是不小心被我撞见的,看到#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;
}

 

转载于:https://www.cnblogs.com/Andrewz/archive/2008/05/07/1186834.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值