首页 新闻 赞助 找找看

结构体的内存问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-03-19 09:49

下面的结构体在内存里是什么样的,在网上看了一些解释,看不明白,感觉不对。

typedef struct structtest { 
  int a:5; 
  int b:2; 
  int c:3; 
}structtest ;

jackbins的主页 jackbins | 初学一级 | 园豆:112
提问于:2012-03-19 00:06
< >
分享
最佳答案
2

这好像是一个公司的笔试题,网上很多解析的,我也做过。。。。

详细内容移步:[c&cpp][memory] 内存对齐分配策略(含位域模式)

typedef struct bitstruct { 
int b1:5;
int b2:2;
int b3:3;
}bitstruct;

int _tmain(int argc, _TCHAR* argv[]) {
bitstruct b;
memcpy(&b,"EM",sizeof(b));
cout<<sizeof(b)<<endl;
cout<<b.b1<<endl<<b.b2<<endl<<b.b3;
return 0;
}

对于bitstruct是含有位域的结构体,sizeof(int)为4字节,按照规则1、2,首先b1占起始的5个字节, 根据含位域规则1, b2紧跟存放,b3也是紧跟存放的。 
根据规则5,得到sizeof(bitstruct) = 4。 
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,motorola系列的CPU采用的是big endian. 
以主流的little endian分析: 
在进行内存分配的时候,首先分配bitstruct的第一个成员类型int(4字节),这四个字节的存放按照低字节存储在低地址中的原则。 
int共4个字节: 
第4个字节 - 第3个字节 - 第2个字节 - 第1个字节,

在内存中的存放方式如下所示。 
而后为b1分配5位,这里优先分配的应该是低5位,也就是第一个字节的低5位。 
继而分配b2的2个字节,也就是第1个字节中紧接着的2位。 
最后分配b3的3位,按照规则1、2,b3还是紧接着存放的,b3的最低位是第一个字节的最高位,高两位为第2个字节的低两位。 
内存分配图如下所示:

QQ截图未命名

字符E二进制为0100 0101,字符M的二进制为0100 1101,在内存中存放如下所示:

QQ截图未命名2

memcpy为按位拷贝的,所以两片内存区可以直接对应上,得到 
b1的二进制形式为:00101 ,高位为0,正数,5 
b2的二进制形式为:10 ,高位为1,负数,取反加1,添加符号,-2 
b3的二进制形式为:b3的最低一位是0,高位为01,拼接后为010,正数,2

内存分配情况感觉蛮奇怪的,按如下修改例7,b1应该为5,b2为-2,b3为-6,VC8.0下验证正确。 

typedef struct bitstruct { 
int b1:5;
int b2:2;
int b3:4;
}bitstruct;

int _tmain(int argc, _TCHAR* argv[]) {
bitstruct b;
memcpy(&b,"EM",sizeof(b));
cout<<sizeof(b)<<endl;
cout<<b.b1<<endl<<b.b2<<endl<<b.b3;
return 0;
}
收获园豆:50
zsounder | 老鸟四级 |园豆:2819 | 2012-03-19 09:08

谢谢~~

jackbins | 园豆:112 (初学一级) | 2012-03-19 09:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册