一个关于结构体的问题
一个关于结构体的问题:
定义一个结构体变量,如下,当TEST结构体第一个变量以short类型定义的时候,以结构体变量名打印,数据是错误值;但是,把第一个变量定义为int类型或unsigned int后,以结构体变量名打印,数据就是结构体中第一个变量的值。
这一点,我不是很明白为什么,还请各位高手讲解。
测试代码如下:
typedef struct
{
unsigned short f;
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
unsigned int e;
}TEST;
typedef struct
{
TESTtt;
unsigned char x;
unsigned int y;
}MYTEST;
int main(int argc, char* argv[])
{
MYTEST g_test;
printf("tt = %d\n", g_test.tt);
g_test.tt.a = 1;
g_test.tt.b = 2;
g_test.tt.c = 3;
g_test.tt.d = 4;
g_test.tt.e = 99;
g_test.tt.f = 77;
g_test.x = 5;
g_test.y = 6;
printf("tt = %d\n", g_test.tt);
printf("g_test = %d\n", g_test);
return 0;
}
[解决办法]
#include <stdio.h>
typedef unsigned char BYTE;
void
print_memory (BYTE * start, int size)
{
int i;
for (i = size - 1; i >= 0; --i)
{
printf ("%p:%02x\n", start + i, *(start + i));
}
}
typedef struct
{
unsigned short f;
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
unsigned int e;
} TEST;
typedef struct
{
TEST tt;
unsigned char x;
unsigned int y;
} MYTEST;
int
main (int argc, char *argv[])
{
MYTEST g_test;
print_memory ((BYTE *) (&g_test), sizeof (g_test));
printf ("tt = %d\n", g_test.tt);
g_test.tt.a = 1;
g_test.tt.b = 2;
g_test.tt.c = 3;
g_test.tt.d = 4;
g_test.tt.e = 99;
g_test.tt.f = 77;
g_test.x = 5;
g_test.y = 6;
print_memory ((BYTE *) (&g_test), sizeof (g_test));
printf ("tt = %d\n", g_test.tt);
printf ("g_test = %d\n", g_test);
return 0;
}
0xbffff323:42 | y |
0xbffff322:13 | y |
0xbffff321:0a | y |
0xbffff320:14 <- MYTEST.y
0xbffff31f:08 | padding |
0xbffff31e:04 | padding |
0xbffff31d:82 | padding |
0xbffff31c:45 <- MYTEST.x
0xbffff31b:bf | e | | tt |
0xbffff31a:ff | e | | tt |
0xbffff319:f3 | e | | tt |
0xbffff318:28 <- TEST.e | tt |
0xbffff317:42 |padding| | tt |
0xbffff316:13 |padding| | tt |
0xbffff315:0a <- TEST.d | tt |
0xbffff314:14 <- TEST.c | tt |
0xbffff313:42 <- TEST.b | tt |
0xbffff312:13 <- TEST.a | tt |
0xbffff311:0e | f | | tt |
0xbffff310:f8 <- TEST.f <- MYTEST.tt
tt = 1108545272 // 0x42130EF8, g_test not initialized random number here
0xbffff323:00 | y |
0xbffff322:00 | y |
0xbffff321:00 | y |
0xbffff320:06 <- MYTEST.y
0xbffff31f:08 | padding |
0xbffff31e:04 | padding |
0xbffff31d:82 | padding |
0xbffff31c:05 <- MYTEST.x
0xbffff31b:00 | e | | tt |
0xbffff31a:00 | e | | tt |
0xbffff319:00 | e | | tt |
0xbffff318:63 <- TEST.e | tt |
0xbffff317:42 |padding| | tt |
0xbffff316:13 |padding| | tt |
0xbffff315:04 <- TEST.d | tt |
0xbffff314:03 <- TEST.c | tt |
0xbffff313:02 <- TEST.b | tt |
0xbffff312:01 <- TEST.a | tt |
0xbffff311:00 | f | | tt |
0xbffff310:4d <- TEST.f <- MYTEST.tt
tt = 33620045 // 0x0201004D, g_test has been assgined properly
g_test = 33620045