结构体中连续两个char类型时的加偏移访问

 // 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值