// 001.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
// 求结构体对应成员变量的偏移
#define STRUCT_VAR_OFFSET(stType, var) (int)(&((stType*)NULL)->var)
// 注:VC++6.0 下, 对齐设置为默认情况:4字节对齐
// 当出现如下 char 和char数组在一起时,内存分配情况如下:
/*
0012FF60 64 00 00 00 d...
0012FF64 66 53 6F 6E fSon
0012FF68 47 20 68 65 G he
0012FF6C 6C 6C 6F 20 llo
0012FF70 77 6F 72 6C worl
0012FF74 64 00 00 00 d...
0012FF78 00 CC CC CC .烫.
0012FF7C C4 07 00 00 ....
发现此时char所占空间并未对齐,而在0012ff79处,即m_szName后多3字节进行对齐
故在使用时,需注意此种情况。
main()中函数示范了,进行地址加偏移显示时,所出现的问题。
当对如下结构体改写为两个char连续时,
struct tagStudent
{
int m_nNum;
char m_szName; //
char m_Sex; //
int m_nYear;
};
内存占用情况:
0012FF74 64 00 00 00 d...
0012FF78 66 66 CC CC ff烫
0012FF7C C4 07 00 00 ....
两个char类型紧接着存储, 而后进行了四字节的对齐。
当char m_Sex和m_szName分开时,char m_sex进行四字节对齐。
0012FF60 64 00 00 00 d...
0012FF64 53 6F 6E 47 SonG
0012FF68 20 68 65 6C hel
0012FF6C 6C 6F 20 77 lo w
0012FF70 6F 72 6C 64 orld
0012FF74 00 00 00 00 ....
0012FF78 66 CC CC CC f烫.
0012FF7C C4 07 00 00 ....
*/
struct tagStudent
{
int m_nNum;
char m_szName[20]; //
char m_Sex; //
int m_nYear;
};
int main(int argc, char* argv[])
{
tagStudent stu = {
100,
"SonG hello world",
'f',
1988
};
tagStudent* pStu = &stu;
int* p = NULL;
p = (int*)pStu;
p = (int*)((int)p + 8);
printf("%08x/r/n", STRUCT_VAR_OFFSET(tagStudent, m_szName) );
printf("%08x/r/n", STRUCT_VAR_OFFSET(tagStudent, m_nYear) );
printf("%s/r/n%s/r/n",
(char*)p, // 显示结果为:G hello world
pStu->m_szName); // 正常显示:SonG hello world
return 0;
}