C语言常见面试题及答案(实战接地气版)_第1页
C语言常见面试题及答案(实战接地气版)_第2页
C语言常见面试题及答案(实战接地气版)_第3页
C语言常见面试题及答案(实战接地气版)_第4页
C语言常见面试题及答案(实战接地气版)_第5页
全文预览已结束

下载本文档

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

文档简介

C语言常见面试题及答案(实战接地气版)一、C语言基础语法面试题1、谈谈C语言中const关键字的作用?答:const本质是修饰只读变量,不是常量,编译阶段不替换值,运行时依然占内存。主要三个用法:修饰普通变量:变量不能被修改,只能读取,比如constinta=10;后续不能给a赋值。修饰指针:分两种情况,const在*左边是指针指向的内容不可改,指针本身可移动;const在*右边是指针本身不可改,指向内容可改。修饰函数参数:防止函数内部意外修改传入的实参数据,提高代码安全性,也能让调用者一眼看出参数不会被改动。2、define和const的区别?(高频必问)答:核心区别是预处理和编译的差异,日常开发优先用const:define是预处理指令,纯文本替换,没有类型检查,不占内存,容易产生边界bug。const是变量修饰符,有明确数据类型,编译器会做类型校验,占用内存空间,支持调试。define定义的宏是全局替换,作用域覆盖全文;const变量有固定作用域,遵循变量作用域规则。3、static关键字的三种用法?答:static核心作用是改变生命周期和作用域:修饰局部变量:变量生命周期延长到程序结束,只初始化一次,上次调用的值会保留到下次。修饰全局变量:仅限当前源文件使用,其他文件无法extern引用,实现文件私有化。修饰函数:函数仅当前文件可调用,外部文件不可访问,避免全局函数命名冲突。4、extern关键字的作用?答:extern是声明不是定义,用来告诉编译器:变量/函数的定义在其他文件或当前文件后方。主要用途:跨文件调用全局变量、跨文件调用函数,不会重复开辟内存,避免重复定义报错。二、指针核心面试题(C语言重难点)1、指针和指针变量的区别?答:很多新手容易混淆,实际完全不一样:指针:就是内存地址,是一个纯数值,没有实体。指针变量:专门用来存放内存地址的变量,占用4字节(32位)/8字节(64位)内存。2、空指针、野指针、悬空指针的区别?答:工作中最容易出bug的三种指针:空指针(NULL):指针变量值为0,明确指向无效地址,安全,使用前判断NULL可规避报错。野指针:未初始化的指针,指向随机未知内存地址,无任何提示,直接操作会导致程序崩溃。悬空指针:指针原本指向合法内存,内存被free释放后,指针未置空,指针地址还在但内存已失效。规避方案:指针初始化置NULL,free之后立刻手动置NULL。3、*和&的作用?&取地址符:取出变量的内存地址,只能作用于变量,不能作用于常量和表达式。*解引用符:通过指针地址,访问对应内存空间的数据,修改指针指向的内容。4、数组指针和指针数组的区别?(高频混淆点)指针数组:char*arr[]本质是数组,数组里的每个元素都是指针变量,常用于存储字符串数组。数组指针:char(*arr)[]本质是指针,专门指向一整个数组,主要用于二维数组传参。三、内存管理面试题1、C语言内存分区有哪几块?各自存什么?答:程序运行时主要分5个区域,面试常考各自特性:栈区:存放局部变量、函数形参、函数返回地址。系统自动分配释放,空间小、速度快,溢出会报栈溢出错误。堆区:存放malloc、calloc动态申请的内存。需要手动free释放,不释放会造成内存泄漏,空间大、灵活。全局/静态区:存放全局变量、static静态变量。程序启动分配,程序结束释放。常量区:存放字符串常量、const修饰的只读数据,内容不可修改,修改会崩溃。代码区:存放程序二进制指令,只读,权限最高。2、malloc、calloc、realloc区别?malloc:申请指定字节堆内存,内存内容随机脏数据,不会初始化。calloc:申请n个大小的内存,会自动初始化为0,效率比malloc稍低。realloc:重新调整已申请堆内存的大小,可扩容、可缩容,会自动迁移原内存数据。3、内存泄漏是什么?怎么避免?答:动态申请的堆内存,使用结束后没有free释放,程序运行期间这块内存一直被占用,无法回收,就是内存泄漏。避免方法:malloc和free成对出现,谁申请谁释放;函数返回前检查所有动态内存,避免中途return导致未释放;free后将指针置空,防止悬空指针问题。四、结构体与联合体面试题1、结构体struct和联合体union的区别?结构体:成员变量独立占用内存,总大小等于所有成员内存之和(考虑内存对齐),所有成员可同时赋值使用。联合体:所有成员共用同一块内存,总大小等于最大成员的内存大小,同一时间只能使用一个成员,主要用来节省内存。2、什么是内存对齐?为什么要对齐?答:编译器为了提高CPU读取效率,会自动对结构体成员内存地址做对齐填充,不会紧凑排列。原因:CPU读取对齐的内存数据速度更快,避免多次读取拼接数据,提升程序运行效率,部分硬件不支持非对齐访问。五、预处理与流程控制面试题1、#include<>和#include""的区别?#include<>:优先从系统库目录查找头文件,用于引入系统自带头文件(stdio.h、string.h)。#include"":优先从当前项目目录查找,找不到再去系统目录,用于引入自定义头文件。2、if-else和switch的使用场景?switch:适合固定离散值判断(整数、字符),分支多的时候代码更清晰,执行效率更高。if-else:适合区间判断、多条件复合判断、浮点型判断,场景更通用。六、高频易错面试题(面试官最爱追问)1、数组名和指针的区别?为什么数组名不能自增?答:数组名本质是数组首地址常量,指针是地址变量。常量的值不允许修改,所以arr++、arr=NULL都是错误写法;而指针变量可以随意赋值、自增自减,这是最核心的区别。2、函数参数传值和传址的区别?传值:传递变量副本,函数内部修改的是副本,不会影响原变量,适合只读数据。传址:传递变量真实地址,函数内部直接操作原变量内存,修改会生效,适合需要改原数据、减少大内存拷贝开销的场景。3、局部变量能不能用static修饰?有什么效果?可以。普通局部变量函数结束就销毁,static修饰的局部变量只会初始化一次,函数多次调用会保留上一次的值,程序结束才销毁。4、字符串结束符'\0'的作用?C语言没有字符串类型,字符串本质是字符数组,\0是字符串结束标记。所有字符串函数(strlen、printf、strcpy)都是以\0

温馨提示

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

评论

0/150

提交评论