题目
有如下宏定义和结构定义
#define MAX_SIZE A+B
struct _Record_Struct
{
unsigned char Env_Alarm_ID : 4;
unsigned char Para1 : 2;
unsigned char state;
unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct* pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);
当A=2, B=3时,pointer分配( )个字节的空间。
分析
本题考察位段的内存分配
- 位段成员中的
:数字
表示此成员分配的内存占据的二进制位有数字
个 - 若位段成员没有
:数字
,则表示成员分配的内存为他的类型本身占有的字节
例如:
struct _Record_Struct{ }*Env_Alarm_Record;
位段中的:
unsigned char Env_Alarm_ID : 4;
表示成员Env_Alarm_ID
所分配的内存为2个二进制位unsigned char state;
表示成员state
所分配的内存为char
类型所占有的内存 ---- 1个字节
- 位段在
VS
中的分配为:
位段内存按照一个字节从低位向高位使用,当剩余的空间不能满足下一个成员的使用时,就会重新开辟一个字节的空间
sizeof(struct _Record_Struct)
:
结构体向最长的char对齐,前两个位段成员一共4+2位,不足8位,合起来占1字节,最后一个位段成员单独1字节,加上第三个成员所占的1字节,一共3字节
#define
执行的是查找替换
sizeof(struct _Record_Struct) * MAX_SIZE
==sizeof(struct _Record_Struct)
*A
+B
== 3 * 2+3 = 9
- 所以
pointer
分配了9个字节的空间