首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个关于结构体的有关问题

2012-03-07 
一个关于结构体的问题一个关于结构体的问题:定义一个结构体变量,如下,当TEST结构体第一个变量以short类型

一个关于结构体的问题
一个关于结构体的问题:
定义一个结构体变量,如下,当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;
}

[解决办法]

C/C++ code
 
#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

热点排行