结构体相关习题的补充

结构体相关习题的补充

题目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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值