C语言结构体面试题及详细答案(企业真实版)_第1页
C语言结构体面试题及详细答案(企业真实版)_第2页
C语言结构体面试题及详细答案(企业真实版)_第3页
C语言结构体面试题及详细答案(企业真实版)_第4页
C语言结构体面试题及详细答案(企业真实版)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言结构体面试题及详细答案(企业真实版)一、基础概念面试题1.简述结构体的作用,以及结构体和普通变量、数组的区别?参考答案:结构体是C语言中用户自定义的复合数据类型,核心作用是将多个不同数据类型、相互关联的数据整合为一个整体,用来描述复杂事物的属性,比如学生信息、员工信息、设备参数等。三者核心区别:1.普通变量:单个变量只能存储单一类型的单个数据,无法整合关联属性;2.数组:只能存储相同数据类型的一组数据,无法混搭整型、字符型、浮点型等不同类型;3.结构体:支持整合任意不同基础类型、自定义类型的数据,逻辑关联性更强,是面向对象思想在C语言中的基础体现。2.结构体变量的初始化方式有哪几种?分别说明使用场景参考答案:结构体常用三种初始化方式,适配不同开发场景:方式1:整体一次性初始化(定义时初始化)语法:和数组初始化类似,按结构体成员定义顺序赋值。适用于结构体成员少、固定赋值的场景。PlainText

structStudent{

charname[20];

intage;

floatscore;

}stu={"张三",20,95.5};方式2:指定成员初始化(C99标准)通过.成员名精准赋值,无需遵循定义顺序,未赋值成员自动初始化为0。适配成员多、只需初始化部分成员的场景,代码可读性极高。PlainText

structStudentstu={.age=20,.score=95.5};方式3:定义后逐个成员赋值先定义结构体变量,再通过变量名.成员名单独赋值。适用于程序运行过程中,动态修改结构体数据的场景。PlainText

structStudentstu;

stu.age=20;

stu.score=95.5;

strcpy(,"张三");注:结构体字符数组成员不能直接用等号赋值,必须使用strcpy函数。3.结构体可不可以自我嵌套?能不能包含自身类型的变量?参考答案:结构体不能包含自身类型的普通变量,但可以包含自身类型的指针变量。1.禁止嵌套自身变量的原因:结构体的内存大小需要在编译时确定,如果包含自身变量,会导致结构体大小无限递归,编译器无法分配内存,直接报错;2.允许嵌套自身指针的原因:指针的内存大小是固定的(32位系统4字节,64位系统8字节),不会影响结构体大小的计算,这也是链表、树等数据结构的核心实现原理。正确示例(链表节点):PlainText

structNode{

intdata;

structNode*next;//合法:自身类型指针

//structNodenode;非法:自身类型变量

};二、结构体内存对齐(高频面试重点)4.什么是结构体内存对齐?为什么需要内存对齐?参考答案:内存对齐是编译器的一种内存分配规则:编译器不会紧凑排列结构体成员,而是按照固定对齐数偏移分配内存,让每个成员的内存地址满足对齐要求。对齐规则(默认编译器规则):1.每个成员的偏移地址,必须是自身大小和系统默认对齐数(通常8字节)的较小值的整数倍;2.结构体的总大小,必须是结构体中最大成员大小的整数倍;3.结构体嵌套时,嵌套结构体的对齐数取其内部最大成员的大小。对齐的核心目的:提升CPU读写效率。CPU读取内存是按块读取(4字节/8字节),未对齐的数据需要CPU多次读取、拼接,浪费性能;对齐后可一次性读取完成,同时部分硬件平台强制要求内存对齐,否则会出现程序崩溃。5.计算以下结构体的大小(32位系统),并说明计算过程PlainText

structTest{

chara;

intb;

shortc;

};参考答案:大小为12字节32位系统默认对齐数4字节,分步计算:1.chara:占1字节,起始地址0,满足1字节对齐,占用地址0;2.intb:占4字节,需要4字节对齐。上一个成员结束于地址0,下一个合法起始地址为4,地址1、2、3补空字节(填充),b占用4~7地址;3.shortc:占2字节,2字节对齐,起始地址8,占用8、9地址;4.结构体总大小需为最大成员int(4字节)的整数倍。当前已用10字节,向上补齐至12字节。6.如何取消结构体内存对齐?实际开发中有什么用途?参考答案:可以通过编译器指令强制取消对齐,实现结构体成员紧凑存储,无填充字节。1.VS编译器指令:#pragmapack(1)2.GCC编译器指令:__attribute__((packed))示例(1字节对齐,无填充):PlainText

#pragmapack(1)

structTest{

chara;

intb;

shortc;

};//大小=1+4+2=7字节

#pragmapack()//恢复默认对齐实际开发用途:主要用于网络通信、硬件协议解析、文件读写。协议报文、硬件寄存器的数据都是紧凑排列的,如果结构体默认对齐填充字节,会导致解析数据错位、收发数据出错,因此必须取消对齐,严格匹配协议格式。三、结构体指针与传参面试题7.结构体传参为什么优先用结构体指针,而不是直接传结构体变量?参考答案:核心原因:节省内存、提升效率、支持修改原数据1.内存开销不同:直接传结构体变量,会在函数栈中拷贝一份完整的结构体数据,结构体越大,拷贝开销越大,容易造成栈溢出;结构体指针传参,仅传递4/8字节的地址,开销极小;2.数据修改能力不同:值传递是拷贝副本,函数内修改结构体成员,不会影响外部原数据;指针传递直接操作原变量内存,可以修改原始数据;3.执行效率不同:避免大块数据拷贝,函数调用效率大幅提升,是工程开发中的标准写法。8.结构体变量和结构体指针访问成员的区别?参考答案:1.结构体普通变量:使用.访问成员,语法:变量名.成员名2.结构体指针变量:使用->访问成员,语法:指针名->成员名底层原理:.运算符直接操作变量内存;->运算符先解引用指针,再访问对应成员。示例:PlainText

structStudentstu;

structStudent*p=&stu;

stu.age=20;//变量访问

p->age=22;//指针访问四、结构体嵌套、联合体对比面试题9.结构体和联合体(共用体)的核心区别?各自使用场景?参考答案:1.内存存储区别(核心)结构体:成员拥有独立内存空间,总大小≥所有成员大小之和(含对齐填充),所有成员可同时赋值、同时存在;联合体:所有成员共用同一块内存空间,总大小等于最大成员的大小,同一时间只能存储一个成员的数据,赋值新数据会覆盖旧数据。2.适用场景结构体:用于存储一组同时存在的关联属性(学生信息、设备参数等常规数据存储);联合体:用于数据类型转换、节省内存、协议解析,比如硬件寄存器位解析、网络报文多格式兼容、嵌入式低内存设备数据存储。10.结构体嵌套结构体,内存对齐规则会变化吗?举例说明参考答案:嵌套结构体遵循统一对齐规则:嵌套结构体的对齐数,取其内部最大成员的大小;外层结构体整体依然遵循“总大小为最大对齐数整数倍”的规则。示例(32位系统):PlainText

structInner{

chara;

intb;//最大成员4字节

};

structOuter{

shortx;

structInnery;

};

//Inner大小:8字节

//Outer最终大小:12字节解析:嵌套结构体y的对齐数为4字节,外层成员按4字节对齐规则排布。五、代码改错/分析真题11.找出以下代码的所有错误并修正PlainText

structStudent{

charname[20];

intage;

}stu;

="李四";

stu.age=21;参考答案:错误点:结构体字符数组成员不能直接用赋值运算符(=)赋值。数组名是常量地址,不支持直接赋值操作,编译会报错。修正代码:PlainText

#include<string.h>

structStudent{

charname[20];

intage;

}stu;

strcpy(,"李四");//字符串拷贝赋值

stu.age=21;12.分析以下代码输出结果,说明原因PlainText

#include<stdio.h>

structTest{

inta;

charb;

};

intmain(){

structTestt1={10,'A'};

structTestt2=t1;

t2.a=20;

printf("%d\n",t1.a);

return0;

}参考答案:输出结果为10原因:C语言支持结构体整体赋值,t2=t1会将t1的所有成员数据完整拷贝给t2,二者是两个独立的结构体变量,内存互不干扰。后续修改t2的成员,不会影响t1的原始数据。六、实操编程面试题13.定义学生结构体,编写函数实现学生信息录入和打印(3名学生)参考答案(可直接运行代码):PlainText

#include<stdio.h>

#include<string.h>

//定义学生结构体

structStudent{

charname[20];

intid;

floatscore;

};

//信息录入函数

voidinputInfo(structStudentarr[],intn)

{

for(inti=0;i<n;i++)

{

printf("请输入第%d个学生信息(姓名学号成绩):\n",i+1);

scanf("%s%d%f",arr[i].name,&arr[i].id,&arr[i].score);

}

}

//信息打印函数

voidprintInfo(structStudentarr[],intn)

{

for(inti=0;i<n;i++)

{

printf("姓名:%s学号:%d成绩:%.2f\n",arr[i].name,arr[i].id,arr[i].score);

}

}

intmain()

{

structStudentstuArr[3];

inputInfo(stuArr,3);

printInfo(stuArr,3);

return0;

}14.编写函数,通过结构体指针修改学生成绩参考答案(核心代码):PlainText

#include<stdio.h>

structStudent{

charname[20];

floatscore;

};

//指针修改成绩

voidchangeScore(structSt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论