1.題目
struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
struct s2
{
int i: 8;
int j: 4;
double b;
int a:3;
};
printf("sizeof(s1)= %d\n", sizeof(s1));
printf("sizeof(s2)= %d\n", sizeof(s2));
16
24
2. 由于位域不允許跨兩個字節,因此位域的長度不能大于一個字節的長度,也就是說不能超過8位二進位
3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的
2 在對齊為4的情況下 分析下面程序的結果
struct BBB
{
long num;
char *name;
short int data;
char ha;
short ba[5];
}*p;
p=0x1000000;
p+0x200=____;
(Ulong)p+0x200=____;
(char*)p+0x200=____;
分析:
sizeof(struct BBB) = 24;
p=0x1000000;
p+0x200=____;
= 0x1000000 + 0x200*24 指針加法,加出來的是指針類型的字節長度的整倍數。就是p偏移sizeof(p) *0x200.
(Ulong)p+0x200=____;
= 0x1000000 + 0x200 經過ulong后,這已經不再是指針加法,而變成一個數值加法了
(char*)p+0x200=____;
= 0x1000000 + 0x200*1 結果類型是char*,這兒的1是char的數據類型是1字節
3.分析下面輸出
#i nclude<iostream.h>
#i nclude <string.h>
#i nclude <malloc.h>
#i nclude <stdio.h>
#i nclude <stdlib.h>
#i nclude <memory.h>
typedef struct AA
{
int b1:5;
int b2:2;
}AA;
void main()
{
AA aa;
char cc[100];
strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
memcpy(&aa,cc,sizeof(AA));
cout << aa.b1 <<endl;
cout << aa.b2 <<endl;
}
浙公網安備 33010602011771號