一个关于struct里嵌套union和struct之后的报错问题

Qinlove 2010-05-04 10:48:16
一个简单的结构体里嵌套联合体的代码,里面只保存1~12数字,然后用不同的方法去访问这12个数字。源代码如下:

// empty.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

typedef struct _STRUCT_A
{
union
{
BYTE KEYA[12];

struct _KEYC
{
BYTE KEYC_A[2];
DWORD KEYC_B;
struct _KEYC_C
{
BYTE KEYC_C_A;
BYTE KEYC_C_B;
DWORD KEYC_C_C;
} KEYC_C;
} KEYC;
};
int KEYD
} STRUCT_A, *PSTRUCT_A;

int main(int argc, char* argv[])
{
STRUCT_A STR;
PSTRUCT_A pSTR;
pSTR = &STR;

for(int i=0; i<12; i++)
{
STR.KEYA[i] = i+1;
}

_tprintf(_T("KEYA = { "));
for(int j=0; j<12; j++)
{
_tprintf(_T("%02X "), STR.KEYA[j]);
}
_tprintf(_T("}\n\n"));

_tprintf(_T("KEYC = \n"));
_tprintf(_T(" KEYC_A = %02X %02X\n"), pSTR->KEYC.KEYC_A[0], pSTR->KEYC.KEYC_A[1]);
_tprintf(_T(" KEYC_B = 0x%08X\n"), pSTR->KEYC.KEYC_B);
_tprintf(_T(" KEYC_C_A = %02X\n"), pSTR->KEYC.KEYC_C.KEYC_C_A);
_tprintf(_T(" KEYC_C_B = %02X\n"), pSTR->KEYC.KEYC_C.KEYC_C_B);
_tprintf(_T(" KEYC_C_C = 0x%08X\n"), pSTR->KEYC.KEYC_C.KEYC_C_C);

return 0;
}

我期望的结果是:
KEYA = { 01 02 03 04 05 06 07 08 09 0A 0B 0C }

KEYC =
KEYC_A = 01 02
KEYC_B = 0x06050403
KEYC_C_A = 07
KEYC_C_B = 08
KEYC_C_C = 0x0C0B0A09

但实际的结果却是:
KEYA = { 01 02 03 04 05 06 07 08 09 0A 0B 0C }

KEYC =
KEYC_A = 01 02
KEYC_B = 0x08070605
KEYC_C_A = 09
KEYC_C_B = 0A
KEYC_C_C = 0xCCCCCCCC

不知道为什么,KEYC_B 总是指向了 KEYC_A 两个字节之后,而不是跟在 KEYC_A之后。大家帮我看看 STRUCT_A 哪里下定义错了吗?
...全文
505 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamseyang 2010-05-05
  • 打赏
  • 举报
回复
right!
[Quote=引用 2 楼 qinlove 的回复:]
引用 1 楼 npuhuxl 的回复:
字节对齐


没点醒我啊,为这个问题已经纠结了一两个小时了,能不能说详细点。意思是如果我有定义DWORD, 必须要是从DWORD对齐的位置算起吗?
[/Quote]
瓶盒 2010-05-04
  • 打赏
  • 举报
回复
在项目属性-》C/C++-》代码生成-》结构成员对齐
该项由默认值改为1字节对齐就可
具体原因楼主可搜一下字节对齐
Qinlove 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 npuhuxl 的回复:]
字节对齐
[/Quote]

没点醒我啊,为这个问题已经纠结了一两个小时了,能不能说详细点。意思是如果我有定义DWORD, 必须要是从DWORD对齐的位置算起吗?
npuhuxl 2010-05-04
  • 打赏
  • 举报
回复
字节对齐

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧