[原文: 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端