游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1607|回复: 2

数据转换的问题

[复制链接]

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
发表于 2004-7-25 19:15:00 | 显示全部楼层 |阅读模式
我想把一个char messge[6];的流转换成我自己的结构如下:
typedef struct a
{

int gigi;
char lolo;
char lulu;

}Msg,*LPMsg;

int main(int argc, char *argv[])
{
  char messge[6];
  
  messge[0]=0;   //
  messge[1]=1;      //这四个填充了int gigi;也就是说此时gigi=256;
  messge[2]=0;     //
  messge[3]=0;      //

  messge[4]=100;    //这个填充了lolo=100
  
  messge[5]=30;  //这个填充了lulu=30

  
  LPMsg msg=(LPMsg)name;
   
   printf("gigi===%d\n",msg->gigi);
   printf("lolo ===%d\n",msg->lolo);
   printf("lulu===%d\n",msg->lulu);
  

  
  system(&quotAUSE");       
  return 0;
}
结果运行得很好。。。正如我所假设的
gigi===256
lolo ===100
lulu===30

//=================下面就是我要阐述的主要内容===
只要我把这个结构里的3个变量的声明顺序改变下的话 如下:
typedef struct a
{

char lolo;
char lulu;
int gigi;        //把这个4个字节的放到最后面

}Msg,*LPMsg;

messge[0]=100;   //这个填充了lolo=100
  messge[1]=1;      //这个填充了lulu=30


  messge[2]=0;     //
  messge[3]=1;      //
  messge[4]=0;    //gigi按道理来说因该是256但结果数据出奇的大
messge[5]=0;  //
输出的结果出呼我的意料之外;
请问为什么换了一下位置就会出现这个情况呢??谁给我个解释。
谢谢
gigi的数大得惊人。。。。。。。

2

主题

57

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2004-7-26 13:48:00 | 显示全部楼层

Re:数据转换的问题

C++是按32位对齐的,
你试看看sizeof(Msg)的实际大小。
解决办法是在定义之前加入
#pragma pack(push, 1)

0

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2004-7-30 00:48:00 | 显示全部楼层

Re:数据转换的问题

前者的内存结构是:
0x00000000   0   1   0   0
0x00000004  100  30
0x00000006  .......      
后者的内存结构:
0x00000000  100  30  0   1
0x00000004   0   0     X   X
后面的XX有系统填充,随机,所以很大
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-4 10:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表