首页
社区
课程
招聘
[原创]深入理解C语言五-结构体的内存结构
发表于: 2021-7-25 18:16 5353

[原创]深入理解C语言五-结构体的内存结构

2021-7-25 18:16
5353

对于结构体,假设:
1、编译对齐值为zp
2、成员变量在结构体定义中的偏移量为Offset
3、结构体变量自身对齐值为Align
4、结构体变量占用内存大小为Size
则:
1、Offset % min(zp,sizeof(member type)) == 0
2、Align = max(sizeof(member type),Align = min(zp,align)
3、Size % align == 0
其中:

VS2019结构体对齐值默认为8字节:

结构体成员变量的内存分布:


结构体总大小为32字节。

/*
Offsetof() = (size_t)&(((Struct*)0)->member)
Struct.member = *(member type*)((int)&Struct + member offset)
*/
typedef struct _PERSON
{
    int id;
    char name[16];
    int age;
}PERSON, * PPERSON;
//求结构体的地址到它的成员变量的地址的距离(字节为单位)
int nIdOffset = (size_t) & (((PPERSON)0)->id);
int nNameOffset = (size_t) & (((PPERSON)0)->name);
int nAgeOffset = (size_t) & (((PPERSON)0)->age);
printf("offset:id:%d,name:%d,age:%d\n", nIdOffset, nNameOffset, nAgeOffset);
 
PERSON tagPerson = { 9,"xiaoxin",6 };
int nID = *(int*)((int)&tagPerson + nIdOffset);
char* szName = (char*)((int)&tagPerson + nNameOffset);
int nAge = *(int*)((int)&tagPerson + nAgeOffset);
printf("person:id:%d,name:%s,age:%d\n", nID, szName, nAge);
/*
Offsetof() = (size_t)&(((Struct*)0)->member)
Struct.member = *(member type*)((int)&Struct + member offset)
*/
typedef struct _PERSON
{
    int id;
    char name[16];
    int age;
}PERSON, * PPERSON;
//求结构体的地址到它的成员变量的地址的距离(字节为单位)
int nIdOffset = (size_t) & (((PPERSON)0)->id);
int nNameOffset = (size_t) & (((PPERSON)0)->name);
int nAgeOffset = (size_t) & (((PPERSON)0)->age);
printf("offset:id:%d,name:%d,age:%d\n", nIdOffset, nNameOffset, nAgeOffset);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//