C语言结构体习题

选择题(本大题30分每小题2分) A) main函数必须放在C程序的开头 B) main函数必须放在C程序的最后

C) main函数可以放在C程序的中间部分,但在执行C程序时是从程序开头执行的 D) main函数可以放在C程序嘚中间部分但在执行C程序时是从main函数开始

2.在下面几组数据类型中, 全为最常用的基本数据类型的是哪一组: 。 A)整型 实型 字符型 B)整型 数組 指针

C)数组 结构体 共用体 D)指针 逻辑型 空类型 3.若有说明语句:char c= ?\\64? ; 则变量C包含:

A)1个字符 B)2个字符

C)3个字符 D)说明不合法,C值不确定 4.设有洳下定义和执行语句其输出结果为: 。 int a=3,b=3;

A)for循环只能用于循环次数已经确定的情况 B)for循环是先执行循环体语句后判断表达式 C)在for循环中,不能用break语句跳出循环体

D)for循环的循环体语句中可以包含多条语句,但必须用花括号括起来

1.下列说法正确的是

6.能正确表示x的取值范围茬[0,100]和[-10-5]内的表达式是 。

9.若二维数组a有m列则a[I][j]元素前的数组元素个数为: 。

10.C语言中变量的指针指的是:

A)变量类型 B)变量值 C)变量值 D)變量地址

12.以下程序的运行结果是: 。

13.在C语言程序中若未在函数定义时说明函数类型,则函数默认的类型为: A)void B)double C)int D)char

14.在说明一个结构體变量时系统分配给它的存储空间是 。

A) 该结构体中第一个成员所需存储空间 B) 该结构体中最后一个成员所需存储空间

C) 该结构体中占用最大存儲空间的成员所需存储空间 D) 该结构体中所有成员所需存储空间的总和

15.使用fseek函数可以实现的操作是

A) 改变文件的位置指针的当前位置

B) 文件的順序读写 C) 文件的随机读写 D) 以上都不对

二、判断题(本大题10分,每小题1分)

1、C程序可以由若干个源文件组成因此最小的功能单位是源文件,最小编译单位的是函数( )

2、C程序有三种结构化程序设计方法,分别顺序结构、选择结构和循环结构( ) 3、在if语句中,if子句与else子句嘟可以单独使用构成了if语句的两种缺省形式。( ) 4、for语句作为循环控制语句时其括号内各个表达式及其后的分号都可缺省。( ) 5、C程序中函数不可以嵌套定义但可以嵌套调用( ) 6、字符串可以用来给数组赋值,在C程序的执行语句中可以直接用字符串给数组名赋值

7、數组名也可作为函数参数使用,此时数组名代表数组的起始地址( ) 8、在函数内的复合语句中定义的变量在本函数范围内有效。( ) 9、聲明一个结构体类型的一般形式为struct 结构体名 {成员表列};( )

10、ANCI C规定了标准输入输出函数库,用fseek()函数来实现打开文件( )

三、程序填空題(本大题12分,每小题2分)

1.下面程序可求出1~1000的自然数中所有的完数(因子和等于该数本身的数)请填空

四、写出下面程序的执行结果(夲大题24分,每小题4分) 1.#include main( )

这是工程师面试后的实际经历……

这道经典、易错的关于C语言结构体内存对齐的题目你真的会吗:

下面看一下实际测试情况:

在32bit环境中,该结构体所占的字节数为16答對了吗?

嘿嘿做个小调查(方便以后选题):

运行结果打印输出了很多重要的信息,从结果往前分析思路应该很清晰了吧

不清晰也没關系,下面我们一起来分析分析:

在分析这个问题之前我们先记住关于结构体内存对齐的三条原则:

(1)结构体变量的起始地址能够被其最宽的成员大小整除。

(2)结构体每个成员相对于起始地址的偏移能够被其自身大小整除如果不能则在前一个成员后面补充字节

(3)结构体总体大小能够被最宽的成员的大小整除如不能则在后面补充字节

分析这个问题我们就不考虑编译器可以指定对齐大小的情况叻在32bit环境中,一般默认的对齐大小是4

下面我们根据这三条原则来分析,并得出如下示意图:

从这张图中我们应该可以很清晰地看出整個结构体变量的内存占用情况

如果还看不明白的朋友可阅读下面的解释(有点啰嗦,已经看明白的就不用看了~):

从上例的结果中我們结构体变量test_s的起始地址为0x0028ff30,能够被其最宽的成员(int类型的d成员占4个字节)整除,符合第(1)条原则

a成员的地址即为结构体变量的起始地址0x0028ff30,排在a后面的是short类型(两个字节)的b成员

根据第(2)条规则,显然b的地址不能从0x0028ff31开始则编译器会在b成员的前一个成员(a成员)後边补1个空白字节,即b的地址为从0x0028ff32符合规则(2)。

b成员占两个字节两个字节之后的地址为0x0028ff34,而c成员为char类型(1字节)则根据规则(2),c成员会存放至地址0x0028ff34处

c成员占1个字节,1个字节之后的地址为0x0028ff35排在c后面的是int类型(4个字节)的d成员,显然不能满足规则(2)

编译器会茬d成员的前一个成员(c成员)后面进行字节填充,这里必须填充3个字节才能符合规则(2)此时d会存放至地址0x0028ff38处。

d成员占4个字节4个字节の后的地址为0x0028ff3c。根据规则(2)e成员可从该地址开始存放。

此时a+空白字节+b+c+空白字节+d+e所占的字节总数为13个字节而结构体最宽的成员(int类型嘚d成员)所占字节数为4字节。

显然不能满足规则(3)编译器会在e成员后面填充3个字节。即整个结构体变量test_s所占的总字节数为16字节

(1)鼡保留变量替代填充字节

实际应用中我们可以上面的结构体变量改为:

我们已经知道了编译器会自动给我们的结构体变量填充一些空白字節,这些填充字节我们是看不到的是隐性的。

在结构体变量占用相同内存的情况下我们可以显性的表示出这些填充字节,即创建一些保留成员

这样当我们需要给这个结构体添加一些成员时,我们可以把保留的成员替换为实际的成员这样在一定程度下有利于我们节省內存空间。

(2)调整结构体成员的位置

从上面的分析中我们知道编译器会根据我们结构体成员的排列来进行空白字节填充以达到对齐的效果

那么我们自己进行手动对齐一些成员,那就可以节省一些空间了比如把上面的我们的test_struct结构体成员的顺序改为:

则结构体变量test_s所占的芓节数变为12字节,即:

即比原来的16字节省下了4个字节

虽然这点优化对于一般的嵌入式应用来说可能没什么必要,但是万一某一天真的需偠在某些资源极其受限的嵌入式设备中开发应用这就是可以优化的一点。

以上就是本次的实验分享这道结构体内存对齐的题目很经典、也很容易出错,是笔试、面试题中的高频题目很有必要弄清楚。

对于热爱编程的人来说有一群一起学习一起解答的小伙伴很重要!

UP嘚主页有一个C/C++编程学习交流俱乐部(群)传送通道:!

还有编程学习文件(源码,零基础教程项目实战教学视频),欢迎初学者和正在進阶中的小伙伴们!

我要回帖

 

随机推荐