单手游戏:关于struct的用法,请各位高手看看

来源:百度文库 编辑:高考问答 时间:2024/04/30 12:08:11
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define uchar unsigned char
#define uint unsigned int
struct ko{
uchar de;
uchar so;
long fr;
};
main()
{
uchar aa[6]={'a','b',1,1,10,10}; //{"abcd"};
struct ko *tt; //={};
//&tt.de=aa;
//double kkk=122;
//float ppp=3.12;
//uchar nnn=12;
//uint iii=54;
tt=(struct ko *)aa;
//printf("iii=%d\n",sizeof(iii));
//printf("nnn=%d\n",sizeof(nnn));
//printf("ppp=%d\n",sizeof(ppp));
//printf("kkk=%d\n",sizeof(kkk));
//printf("tt->de=%d\n",sizeof(tt->de));
//printf("tt->fr=%d\n",sizeof(tt->fr));
printf("de=%c\nso=%c\nHello, world\nfr=%d\n",tt->de,tt->so,tt->fr);
getch();
return 0;
}

该程序我在vc里面验证过,但是输出的tt->fr并不是我希望的0x01010a0a
而是0xcccc0a0a,也就是说前面的两个字节错了,
后来我把前面的两个数据改成其它的数,输出仍然是0xcccc0a0a
再后来我又将tt->fr的数据类型改为unsigned char,能够正常输出。
所以我想让高手帮我看看,是哪里出错了,谢谢!
我这样做的好处是想让我的数组能够自动的得到INT型的,然后直接处理。所以我希望能把这个问题搞清楚。

可能因为编译器的优化
为了提高fr的访问速度编译器将它定位到内存的整双字位置,导致so后出内存间隔可用:&(tt->fr)- &(tt->so)察看

呵呵,你这个问题涉及到了结构体的内存结构问题,你这个结构体在内存空间中占用的空间并不简单是几个值空间大小的和。其中涉及到了内存对齐的问题,char占用一个字节,但是由于编译器的设置,在生成的空间中要和long变量对其。于是也就是为什么都申明为char就没有问题的缘故。

正解,尽量不要写这种和编译环境相关的代码