C语言基础面试题及详细答案(实战版)-1_第1页
C语言基础面试题及详细答案(实战版)-1_第2页
C语言基础面试题及详细答案(实战版)-1_第3页
C语言基础面试题及详细答案(实战版)-1_第4页
C语言基础面试题及详细答案(实战版)-1_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

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

文档简介

C语言基础面试题及详细答案(实战版)本套面试题适配应届生、初级开发岗位面试,覆盖C语言核心基础、语法细节、内存机制、指针、数组、函数、预处理等高频考点,答案贴合工程实操,通俗易懂,无冗余理论。一、基础语法与变量常量(高频基础题)1、简述C语言中局部变量和全局变量的区别?答案:1.定义位置不同:局部变量定义在函数、代码块内部;全局变量定义在所有函数外部。2.作用域不同:局部变量仅在当前函数/代码块内有效,出作用域立即失效;全局变量整个源文件乃至跨文件(可通过extern声明)都可使用。3.内存存储不同:局部变量存放在栈区;全局变量存放在全局数据区(静态存储区)。4.初始化默认值不同:局部变量未手动初始化时,值是随机垃圾值;全局变量系统默认初始化为0。5.生命周期不同:局部变量随函数调用创建,函数执行结束销毁;全局变量随程序启动创建,程序退出才销毁。2、static关键字在C语言中有哪些用法?答案:static主要有三个核心用途,是面试高频考点:1.修饰局部变量:改变变量存储区域,从栈区变为静态存储区,生命周期延长至程序结束,仅初始化一次,下次调用函数会保留上一次的值。作用域不变,仍仅限当前函数内使用。2.修饰全局变量:限制全局变量的作用域,仅能在当前源文件中使用,无法被其他文件通过extern引用,实现文件级别的私有化。3.修饰函数:限制函数仅能在当前源文件内部调用,外部文件无法引用,常用于封装模块内部私有函数。3、const关键字的作用是什么?常用写法有哪些区别?答案:const用于修饰只读变量,被修饰后变量值不可修改,编译阶段会校验,防止误修改数据。常用三种核心写法区别:1.constinta;:a是只读变量,值不可修改。2.constint*p;:指针指向的值不可改,但指针本身的地址可以改(指向可变更)。3.int*constp;:指针本身的地址不可改,但指向的值可以修改。4.constint*constp;:指针地址和指向的值都不可修改。二、指针核心考点(C语言重难点)4、指针和数组的关系是什么?数组名是不是指针?答案:数组名不是指针,二者本质不同,只是使用场景高度相似。1.本质区别:数组名代表整个数组的内存空间,是一个常量地址,不可赋值;指针是一个变量,存储的是内存地址,自身可以修改。2.取值区别:对数组名sizeof,得到的是整个数组的字节大小;对指针sizeof,得到的是指针变量本身的大小(32位系统4字节,64位系统8字节)。3.转换规则:数组名在大多数表达式中,会隐式转换为指向数组首元素的指针,因此a[i]和*(a+i)完全等价。5、野指针是什么?如何避免野指针问题?答案:野指针指指向未知、不受管控内存地址的指针,没有合法的指向空间。野指针不会报错,但会导致程序崩溃、内存错乱、随机bug等问题。常见产生原因:1.指针定义后未初始化,指向随机地址;2.指针指向的内存已经释放、销毁,但指针未置空;3.指针越界访问内存空间。避免方法:1.指针定义时直接初始化,要么指向合法变量,要么赋值为NULL;2.内存释放、变量销毁后,立即将对应指针置为NULL;3.使用指针前先判断是否为NULL,避免空指针和野指针访问;4.严格控制指针访问范围,杜绝数组和内存越界。6、二级指针的作用是什么?什么场景下需要使用二级指针?答案:二级指针是指向指针的指针,核心作用是修改一级指针本身的地址值。常用场景:1.函数内部修改实参指针:普通一级指针传参只能修改指针指向的数据,无法修改指针本身的指向;使用二级指针传参,可在函数内修改外部一级指针的指向。2.操作字符串数组、二维数组:存储多个字符串地址、二维指针数组时,必须使用二级指针。3.动态内存二维空间分配:动态创建二维数组时,依赖二级指针实现。三、内存管理(高频面试核心)7、C语言程序的内存分区有哪几个?各自存放什么内容?答案:C程序运行时内存主要分为5个区域:1.栈区(stack):存放局部变量、函数参数、函数返回地址。由系统自动分配、自动释放,空间有限,读写速度快。2.堆区(heap):存放动态内存(malloc、calloc、realloc申请的内存)。由开发者手动申请、手动free释放,程序结束未释放会造成内存泄漏,空间大、灵活度高。3.全局/静态区:存放全局变量、static修饰的静态变量。程序启动分配内存,程序结束释放,未初始化默认值为0。4.常量区:存放字符串常量、const修饰的只读常量。数据只读,不可修改,修改会触发程序崩溃。5.代码区:存放程序编译后的二进制机器指令,只读,用于CPU执行程序。8、malloc、calloc、realloc三个函数的区别?答案:三者都是堆区动态内存申请函数,核心区别在初始化和扩容逻辑:1.malloc:申请指定字节大小的堆内存,不会初始化内存,内存值为随机垃圾值,参数为单一内存字节数。2.calloc:申请n个大小为size的内存空间,自动将内存初始化为0,参数为数量+单块大小,适合需要初始化清零的场景。3.realloc:对已申请的堆内存进行扩容或缩容,可保留原内存数据。扩容时若原空间后续足够,直接追加空间;若空间不足,会重新开辟新空间、拷贝数据、释放旧空间。补充:三个函数申请内存后都需要手动free释放,否则会造成内存泄漏。9、内存泄漏是什么原因造成的?如何避免?答案:内存泄漏指堆区动态申请的内存,程序运行结束后未被释放,且程序失去对该内存的控制权,导致系统内存被持续占用,无法回收。常见原因:1.malloc/calloc/realloc申请内存后,未调用free释放;2.指针指向变更,丢失原堆内存地址,无法找到内存进行释放;3.函数内申请堆内存,返回前未释放,且无外部指针接收。避免方法:1.遵循“谁申请、谁释放”原则,动态内存使用完毕立即free;2.内存释放后及时将指针置为NULL,防止野指针;3.复杂逻辑统一管理内存生命周期,避免指针覆盖丢失地址。四、函数与预处理考点10、形参和实参的区别?C语言参数传递机制是什么?答案:1.实参:调用函数时,传入的真实参数,可以是常量、变量、表达式,存放在主调函数栈中。2.形参:函数定义时括号内的参数,仅在函数调用时分配内存,函数结束立即销毁,属于局部变量。C语言所有参数传递都是值传递:普通变量传参:传递的是变量的值拷贝,函数内修改形参,不会影响外部实参;指针传参:传递的是地址的值拷贝,函数内可通过地址修改外部实参指向的数据,但无法修改实参指针本身的指向。11、宏定义和函数的区别?为什么复杂场景不建议用宏?答案:1.处理阶段不同:宏是预处理阶段直接文本替换,无参数校验、无类型检查;函数是编译阶段处理,有严格的参数类型校验、语法检查。2.运行效率不同:宏无函数调用开销,直接替换代码,执行速度快;函数调用需要压栈、跳转、出栈,有少量开销。3.安全性不同:宏容易产生隐性bug,比如运算优先级问题、参数多次求值问题;函数逻辑严谨,安全性更高。4.代码复用:宏每次使用都会替换代码,会增加代码体积;函数代码仅存储一份,多次调用不增加冗余代码。总结:简单常量、简单表达式可用宏;复杂逻辑、带运算的场景优先用函数,避免bug。12、#include<>和#include""的区别?答案:1.#include<文件名>:优先从系统库目录查找头文件,用于引入系统标准头文件(stdio.h、stdlib.h、string.h等),查找速度快。2.#include"文件名":优先从当前项目工程目录查找,找不到再去系统库目录查找,用于引入自定义头文件。五、常见易错坑点(面试真题高频坑)13、switch语句中default一定要写吗?break的作用是什么?答案:default不是语法必须的,但工程开发中建议必写,用于处理所有未匹配的异常情况,增强程序健壮性,避免未知分支遗漏。break作用:跳出当前switch分支,防止case穿透。如果不写break,匹配成功后会继续执行下一个case的代码,不再判断条件,容易产生逻辑错误。14、数组作为函数参数传递时,会发生什么变化?答案:数组作为函数形参时,会退化为指针。此时在函数内通过sizeof计算数组长度,得到的是指针的大小(4/8字节),无法获取原数组真实长度。因此数组传参时,必须额外传递数组长度参数,否则无法正确遍历数组。15、头文件重复包含的问题怎么解决?答案:多个文件引入同一个头文件时,会出现重复定义报错,工程中通用两种解决方式:1.条件编译(主流写法):#ifndef宏名

#define宏名

//头文件内容

#endif原理:第一次引入定义宏,后续再次引入时宏已存在,跳过内容,避免重复包含。2.#pragmaonce:编译器指令,简洁高效,主流编译器均支持,直接防止头文件重复包含。六、编程实操简答题(面试官常问手写思路)16、写代码判断一个年份是否为闰年,简述判断规则答案:闰年判断规则:1.能被4整除且不能被100整除,是闰年;2.能被400整除的年份,是闰年;其余情况为平年。核心判断公式:(year%4==0&&year%10

温馨提示

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

评论

0/150

提交评论