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