结构体相关习题的补充
题目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