結構體相關習題的補充
題目1:
如有以下代碼:
struct student
{int num;char name[32];float score;
}stu;
則下面的敘述不正確的是:( )
A.struct 是結構體類型的關鍵字
B.struct student 是用戶定義的結構體類型
C.num, score 都是結構體成員名
D.stu 是用戶定義的結構體類型名
解析
struct student
{int num;char name[32];float score;
}stu;//stu是變量
答案 :D
題目2:
下面程序的輸出結果是:( )
struct stu
{int num;char name[10];int age;
};void fun(struct stu *p)
{printf("%s\n",(*p).name);return;
}int main()
{struct stu students[3] = {{9801,"zhang",20},{9802,"wang",19},{9803,"zhao",18} };fun(students + 1);return 0;
}
A.zhang
B.zhao
C.wang
D.18
解析
(*p).name 是訪問結構體,fun(students+1)意思是訪問結構體的第二個成員,不管結構體的實例是什么——訪問其成員其實就是加成員的偏移量。
答案 :C
題目3:
下面程序要求輸出結構體中成員a的數據,以下不能填入橫線處的內容是( )
#include < stdio.h >
struct S
{ int a;int b;
};
int main( )
{ struct S a, *p=&a;a.a = 99;printf( "%d\n", __________);return 0;
}
A.a.a
B.*p.a
C.p->a
D.(*p).a
解析
指針->成員
結構體變量. 成員
答案 :B
題目4:
在VS2013下,默認對齊數為8字節,這個結構體所占的空間大小是( )字節
typedef struct{int a;char b;short c;short d;
}AA_t;
A.16
B.9
C.12
D.8
解析
這個題目需要我們去畫出內存圖
圖例1:
圖例2:
步驟一:首先標出所有類型的數的字節大小
步驟二:與默認對齊數進行對比,判斷所占空間大小
步驟三:從0開始,開始計算,根據對齊原則,得到上述結果
再來好好品一品這張導圖,回顧結構體對齊原則
題目5:
在32位系統環境,編譯選項為4字節對齊,那么sizeof(A)和sizeof(B)是( )
struct A
{int a;short b;int c;char d;
};struct B
{int a;short b;char c;int d;
};
A.16,16
B.13,12
C.16,12
D.11,16
解析
答案 C
題目6:
下面代碼的結果是:( )
#pragma pack(4)/*編譯選項,表示4字節對齊 平臺:VS2013。語言:C語言*/
//假設long 是4個字節
int main(int argc, char* argv[])
{struct tagTest1{short a;char d; long b; long c; };struct tagTest2{long b; short c;char d;long a; };struct tagTest3{short c;long b;char d; long a; };struct tagTest1 stT1;struct tagTest2 stT2;struct tagTest3 stT3;printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));return 0;
}
#pragma pack()
A.12 12 16
B.11 11 11
C.12 11 16
D.11 11 16
解析
答案:A
題目7:
有如下宏定義和結構定義
#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分配( )個字節的空間。
A.20
B.15
C.11
D.9
解析
#define MAX_SIZE 2+3
struct _Record_Struct
{unsigned char Env_Alarm_ID : 4;//1個字節是八個比特位,這個位段是占4個比特位unsigned char Para1 : 2;//這個是占2個比特位//上面兩個一共占了6個比特位,占了1個字節unsigned char state;//沒有進行表識,說明了它獨占1個字節unsigned char avail : 1;//這也占了一個字節
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * 2+3);
考點:位段大小的計算
答案 D
題目8:
下面代碼的結果是( )
int main()
{unsigned char puc[4];struct tagPIM{unsigned char ucPim1;unsigned char ucData0 : 1;unsigned char ucData1 : 2;unsigned char ucData2 : 3;}*pstPimData;pstPimData = (struct tagPIM*)puc;memset(puc,0,4);pstPimData->ucPim1 = 2; pstPimData->ucData0 = 3;pstPimData->ucData1 = 4;pstPimData->ucData2 = 5;printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);return 0;
}
A.02 03 04 05
B.02 29 00 00
C.02 25 00 00
D.02 29 04 00
解析
unsigned char ucPim1;
unsigned char ucData0 : 1;
unsigned char ucData1 : 2;
unsigned char ucData2 : 3; 是結構體位段,ucPim1表示占一個1個字節,下面的數字分別代表占的比特位的大小,首先我們看到2的二進制形式:0000 0010,看到ucPim1占一個字節大小,puc[0]里面是0000 0010,因為是char類型,一個char類型的大小是1個字節大小,相當于8個比特位,看上圖,puc[1]單個大小空間被分成8份,3的二進制位是0000 0011 ,但是ucData只給其分配了1個比特位大小,所以取末尾的1,由此類推,得到puc[1]里面是0010 1001,最后的打印形式是以十六進制的形式打印: 一個十六進制位相當于4個二進制位 所以打印結果為:02 29 00 00
答案
B
2;
unsigned char ucData2 : 3; 是結構體位段,ucPim1表示占一個1個字節,下面的數字分別代表占的比特位的大小,首先我們看到2的二進制形式:0000 0010,看到ucPim1占一個字節大小,puc[0]里面是0000 0010,因為是char類型,一個char類型的大小是1個字節大小,相當于8個比特位,看上圖,puc[1]單個大小空間被分成8份,3的二進制位是0000 0011 ,但是ucData只給其分配了1個比特位大小,所以取末尾的1,由此類推,得到puc[1]里面是0010 1001,最后的打印形式是以十六進制的形式打印: 一個十六進制位相當于4個二進制位 所以打印結果為:02 29 00 00
答案
B