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

c++: 结构体有关问题!

2012-03-13 
c++: 结构体问题!!!!急~~~求助如下结构体定义:typedef struct{char sch_flag : 2char cont_id : 5char m

c++: 结构体问题!!!!急~~~求助
如下结构体定义:
typedef struct
{
char sch_flag : 2;
char cont_id : 5;
char major_ver : 5;
char minor_ver : 4;
}VALUE_B;
则sizeof (VALUE_B)的值是2。( 错) 

sizeof (VALUE_B)的值应该是3.为什么啊?是考虑结构体对齐么?


从4字节对齐的观点来看下面的结构体定义是高效的。(对 错) 
typedef struct tagLIST_t
{
struct tagLIST_t *pNext;//这个,字节数怎么看?
unsigned short element;
  unsigned char flag;
unsigned long value;
}LIST_t;
望详细解释下这两道题。的思路,谢啦


[解决办法]
第一题的解释:结果为3,第一个字节存放sch_flag和cont_id,第二个字节存放major_ver,第三个字节存放minor_ver,你可以认为这里的char是顺序叠加的,超过8位则需要另开一个字节的空间。
第二题的解释:一个指针算一个Int是没错,不过这里的“struct tagLIST_t *pNext”应该理解成这个结构体的空间大小,而不是指针的空间大小,楼主可以自己输出看看。
[解决办法]
对于第一个结构体来说:
我个人认为内存是按字节大小分配地址的。
2 + 5 < 8;分配一个字节,还剩1bit接下来要分配5bit,不够分,1bit浪费
5 < 8;因为 5 + 4 > 8,在此分配一字节够5bit用。
4 < 8;又分一个字节。

假如:刚好分了2个字节,则major_ver占了 两个单元字节,第一个字节用了最后一位,第二个字节用了前四位。这样很难读数据。(按字节分配地址)

[解决办法]
typedef struct
{
char sch_flag : 2;
char cont_id : 5;
char major_ver : 5;
char minor_ver : 4;
}VALUE_B;
对于这个的话,最长不能过8,所以前两个2.5是一个字节,后两个因为过了8,所以单独占用,都是8,加起来就是3个字节


typedef struct tagLIST_t
{
struct tagLIST_t *pNext;//这个,字节数怎么看?
unsigned short element;
unsigned char flag;
unsigned long value;
}LIST_t;
对于这个的话就是用得对齐方式,有4的按4,有8的按8!记住了!

热点排行