C语言结构体基础知识总结和巩固
本帖最后由 sunsili 于 2023-10-14 12:42 编辑C语言结构体基础知识总结和巩固
在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型。为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的。
1. C语言结构体思维导图版权声明:此思维导图转自华为云社区用户CharlesE的文章,文章链接:https://bbs.huaweicloud.com/blogs/243521
2. 知识检验2.1 题1
以下对结构变量stu1中成员age的非法引用是struct student
{
int age;
int num;
} stu1, *p;
p = &stu1;
A. stu1.ageB. student.ageC. p->ageD. (*p).age习题解析:此题考察结构体成员变量引用相关的知识在对结构体成员变量引用的方式中,有两种最为常见的方式,一种是箭头(->)方式的引用,另一种就是点(.)方式的引用。两种引用方式的区别如下:
[*]点(.)方式的引用:点方式的引用用于直接通过结构体变量引用成员变量。
[*]箭头(->)方式的引用:箭头方式的引用用于通过指向结构体变量的指针引用结构体的成员变量。
回到本题,stu1为结构体的变量,而p为指向结构体变量的指针。选项A和C是最常用的一种引用方式, 选项D通过解引用结构体变量指针引用age成员, 这种做法是可以的。而选项B是通过结构体类型名去引用age成员,这显然是错误的。参考答案:B
2.2 题2以下程序输出的结果是什么?struct S1
{
char c1;
int i;
char c2;
};
int main(void)
{
printf("%lu\n", sizeof(struct S1));
return 0;
}
习题解析:此题考察结构体类型占用的存储空间字节数。结构体变量以及其中各成员变量在内存中以对齐的方式进行存储的。遵循如下对齐规则:
[*]第一个成员在与结构体变量偏移量为0的地址处。
[*]其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
[*]结构体总大小为最大对齐数(成员变量都有一个对齐数)的整数倍。
[*]如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所 有最大对齐数(含嵌套结构体的对齐数)的整数倍。
回到本题。我们分析默认4个字节对齐的情况。
成员对齐数偏移占用字节的范围
c1
00 ~ 0
i444 ~ 7
c2188 ~ 8
参考答案:12
2.3 题3
以下程序的输出的结果是什么?struct S2
{
char c;
double d;
int i;
};
int main(void)
{
printf("%lu", sizeof(struct S2));
return 0;
}
习题解析:此题考察结构体类型占用的存储空间字节数。此题,我们依然分析默认4字节对齐的情况根据题1中结构体遵循的对齐规则:
成员对齐数偏移占用字节的范围
c
00 ~ 0
d444 ~ 11
c211212 ~ 12
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍, 所以本题最终的结构体大小为16参考答案:16
2.4 题4 为什么存在内存对齐?
参考答案:
[*]平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。比如说:有些平台只能在地址是4的倍数的地址上访问数据
[*]性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
2.5 题5
给定结构体struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};
问sizeof(A) = ?习题解析:此题考察结构体类型占用的存储空间字节数。根据题1中结构体遵循的对齐规则:
成员对齐数偏移占用字节的范围
t:4, k:4
00 ~ 0
i:8222 ~ 3
m444 ~ 11 (假设unsigned long为8个字节大小)
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍, 所以本题最终的结构体大小为12参考答案:12
页:
[1]