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

下载本文档

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

文档简介

C语言结构化面试题及详细答案(企业真实版)整套试题贴合中小企业、嵌入式、后端岗位真实面试场景,难度循序渐进,包含基础概念、核心重难点、代码纠错、手写编程题,答案通俗精准,无冗余话术,适合面试复习、笔试考核。一、C语言基础概念题(必考基础)1、简述C语言中static关键字的三种用法答案:1)修饰局部变量:改变局部变量的生命周期,程序运行期间变量始终存在,不会随函数调用结束释放;不改变作用域,仅当前函数可访问,变量只会初始化一次。2)修饰全局变量:限制全局变量作用域,仅当前源文件可见,其他文件无法引用,避免全局变量冲突。3)修饰函数:限定函数仅当前源文件调用,外部文件不可调用,实现函数私有化。2、const关键字的作用及常见使用场景答案:const用于修饰只读变量,被修饰的变量值不可修改,可提高代码安全性、减少误修改、方便代码维护。常见场景:1)修饰普通变量:定义只读常量,替代宏定义,可进行类型检查。2)修饰指针:const在*前,表示指针指向的数据不可改;const在*后,表示指针地址不可改。3)修饰函数参数:防止函数内部修改传入的实参数据,常用于字符串、数组传参。3、宏定义#define和const变量的区别答案:1)处理阶段不同:#define是预编译阶段简单文本替换,无类型检查;const变量是编译阶段处理,有严格数据类型检查。2)内存占用不同:宏定义不占用内存;const变量会占用对应类型的内存空间。3)作用域不同:宏定义默认全局有效,可通过#undef取消;const变量遵循变量作用域规则。4)功能差异:宏可实现多行代码、函数式替换;const仅用于定义只读变量,功能单一更安全。4、全局变量和局部变量的区别答案:1)定义位置:全局变量定义在所有函数外部;局部变量定义在函数、代码块内部。2)作用域:全局变量整个工程有效;局部变量仅当前代码块、函数内有效。3)生命周期:全局变量程序启动创建,程序结束销毁;局部变量函数调用时创建,调用结束立即销毁。4)初始化:全局变量默认自动初始化为0;局部变量默认随机垃圾值,需手动初始化。5)内存分区:全局变量存放在全局数据区;局部变量存放在栈区。二、指针核心面试题(C语言重难点)1、野指针是什么?如何避免野指针?答案:野指针:指向未知、非法内存地址的指针,没有明确指向,不受程序管控。常见成因:指针未初始化、指针指向的内存释放后未置空、指针越界访问。危害:会导致程序崩溃、内存错乱、随机报错,bug极难排查。避免方式:1)指针定义时初始化为NULL;2)内存释放后,立即将指针置为NULL;3)使用指针前先判断是否为NULL;4)杜绝指针越界、非法地址赋值。2、*p和&p的区别,指针变量取值原理答案:1)p:存储的是目标变量的内存地址,是一个地址值;2)*p:解引用操作,取出指针地址对应的内存数据;3)&p:取指针变量自身的地址,指针本身也是一个变量,占用栈内存,有独立地址。3、数组指针和指针数组的区别答案:1)指针数组:int*p[5];,本质是数组,数组中每个元素都是int类型指针,主要用于存储多个字符串、多个变量地址。2)数组指针:int(*p)[5];,本质是指针,专门指向一个包含5个int元素的数组,多用于二维数组遍历。核心区分:优先级[]高于*,不带括号先结合[]是数组,带括号先结合*是指针。4、二级指针的使用场景答案:二级指针即指向指针的指针,核心使用场景:1)修改一级指针的指向:函数内部想要修改实参指针的地址,必须传入二级指针;2)存储二维数组、字符串数组地址;3)动态内存分配中,动态开辟指针数组内存。三、内存管理面试题(嵌入式/后端高频)1、C语言四大内存分区及存储内容答案:1)栈区:存放局部变量、函数参数、函数返回地址,系统自动分配释放,空间小、速度快。2)堆区:存放malloc/calloc/realloc动态开辟的内存,需要手动free释放,空间大、可动态调整,不主动释放会造成内存泄漏。3)全局/静态区:存放全局变量、static修饰的静态变量,程序全程占用内存,程序结束由系统释放。4)常量区:存放字符串常量、const修饰的只读常量,内容不可修改,修改会触发程序崩溃。2、malloc、calloc、realloc三个函数的区别答案:1)malloc:开辟指定字节大小的堆内存,内存内容为随机垃圾值,不初始化。2)calloc:开辟n个指定大小的内存,自动将内存初始化为0,安全性更高。3)realloc:重新调整已开辟堆内存的大小,可扩容、缩容,会自动迁移原内存数据。注意:三个函数开辟内存后,都需要手动free释放,且释放后指针置空。3、什么是内存泄漏?如何避免?答案:内存泄漏:动态开辟的堆内存,使用完毕后没有手动释放,程序持续占用内存,导致系统内存资源被耗尽,程序运行卡顿、崩溃。产生场景:函数内开辟堆内存,未返回地址也未释放;指针覆盖导致原堆内存地址丢失;异常分支跳过free语句。避免方式:1)malloc和free成对使用;2)内存使用完毕立即释放,释放后置空指针;3)所有分支逻辑保证内存均可释放;4)避免重复开辟、丢失内存地址。四、代码改错/易错分析题(笔试高频)错题1:字符串赋值错误错误代码:c

charstr[10];

str="hello";错误原因:数组名是常量地址,不支持直接赋值,只能在初始化时赋值,或使用strcpy拷贝。正确代码:c

charstr[10]="hello";

//或

strcpy(str,"hello");错题2:野指针使用错误错误代码:c

int*p;

*p=100;错误原因:指针p未初始化,属于野指针,指向非法内存,直接赋值会程序崩溃。正确代码:c

inta=0;

int*p=&a;

*p=100;错题3:栈内存返回错误错误代码:c

char*test(){

charbuf[]="testdata";

returnbuf;

}错误原因:buf是局部栈变量,函数调用结束后栈内存释放,返回的地址是无效野指针,外部调用会读取乱码。正确方案:使用static修饰数组、全局数组,或堆内存开辟。五、手写编程实操题(面试必写)1、手写代码实现字符串反转思路:双指针法,首尾字符交换,向中间遍历,无需额外开辟内存完整代码:c

#include<stdio.h>

#include<string.h>

voidstr_reverse(char*str)

{

if(str==NULL)return;

intlen=strlen(str);

inti,j;

chartemp;

for(i=0,j=len-1;i<j;i++,j--)

{

temp=str[i];

str[i]=str[j];

str[j]=temp;

}

}

intmain()

{

charbuf[]="interviewtest";

str_reverse(buf);

printf("%s\n",buf);

return0;

}2、手写代码实现冒泡排序(整型数组)完整代码:c

#include<stdio.h>

voidbubble_sort(intarr[],intn)

{

inti,j;

inttemp;

//外层控制排序轮数

for(i=0;i<n-1;i++)

{

//内层两两比较交换

for(j=0;j<n-1-i;j++)

{

if(arr[j]>arr[j+1])

{

temp=arr[j];

arr[j]=arr[j+1];

arr[j+1]=temp;

}

}

}

}

intmain()

{

intarr[]={9,5,2,7,1,3};

intlen=sizeof(arr)/sizeof(arr[0]);

bubble_sort(arr,len);

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

{

printf("%d",arr[i]);

}

return0;

}3、实现字符串长度计算(不使用strlen库函数)完整代码:c

#include<stdio.h>

intmy_strlen(char*str)

{

if(str==NULL)return0;

intcount=0;

while(*str!='\0')

{

count++;

str++;

}

returncount;

}

intmain()

{

charbuf[]="clanguage";

printf("len=%d\n",my_strlen(buf));

return0;

}六、高频简答压轴题1、头文件#include<>和#include""的区别答案:1)#include<>:优先从系统库目录查找头文件,用于引入系统自带头文件,如stdio.h、string.h。2)#include"":优先从当前工程目录查找,找不到再去系统目录查找,用于引入自定义头文件。2、结构体struct和联合体union的区别答案:1)内存存储:结构体成员独立占用内存,总大小为所有成员内存之和(内存对齐);联合体所有成员共用同一块内存,同一时间仅一个成员生效。2)

温馨提示

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

评论

0/150

提交评论