C语言经典面试题(含详细答案)_第1页
C语言经典面试题(含详细答案)_第2页
C语言经典面试题(含详细答案)_第3页
C语言经典面试题(含详细答案)_第4页
C语言经典面试题(含详细答案)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

C语言经典面试题(含详细答案)一、基础语法选择题(10题)1、以下关于C语言变量定义,说法正确的是?A、变量可以先使用后定义

B、全局变量默认初始值为0

C、局部变量默认初始值为0

D、宏定义的变量可以被修改答案:B解析:C语言遵循先定义后使用原则;局部变量存储在栈区,无默认值,是随机脏值;宏定义是预处理替换,编译后不可修改;全局变量存储在全局区,系统默认初始化为0。2、sizeof(char*)在32位系统和64位系统的结果分别是?A、1、1

B、4、8

C、2、4

D、8、8答案:B解析:指针变量存储的是内存地址,32位系统地址占4字节,64位系统地址占8字节,所有类型指针(char*、int*、struct*)大小一致。3、以下哪个关键字不能定义局部变量?A、auto

B、static

C、extern

D、register答案:C解析:extern是外部声明关键字,用于引用外部全局变量或函数,不能定义局部变量;auto是局部变量默认属性,static定义静态局部变量,register定义寄存器局部变量。4、关于if-else语句,以下代码输出结果是?PlainText

#include<stdio.h>

intmain()

{

inta=0;

if(a>0)

printf("1");

elseif(a<0)

printf("2");

else

printf("3");

return0;

}A、1

B、2

C、3

D、无输出答案:C解析:变量a值为0,不满足大于0和小于0的条件,执行最后一个else分支,输出3。5、C语言中,constint*p和int*constp的区别,说法正确的是?A、两者完全无区别

B、constint*p指针地址不可改

C、int*constp指针地址不可改,指向的值可改

D、constint*p指向的值可强制修改答案:C解析:const修饰谁,谁就不可修改。constint*p:修饰*p,指针指向的数据只读,指针地址可以修改;int*constp:修饰p,指针地址固定不可改,指向的数据可以修改。6、以下循环的执行次数是?PlainText

inti=0;

while(i++<3)

{

printf("%d",i);

}A、2次

B、3次

C、4次

D、无限循环答案:B解析:i++是先取值判断,后自增。判断过程:i=0,0<3成立,i变为1,执行循环;i=1<3成立,i变为2,执行;i=2<3成立,i变为3,执行;i=3<3不成立,循环结束,总共执行3次。7、数组intarr[5]={1,2};数组剩余元素的值是?A、随机值

B、0

C、NULL

D、无值答案:B解析:C语言中数组初始化时,部分元素赋值,未显式赋值的元素会被系统自动初始化为0。8、关于switch语句,说法错误的是?A、case常量必须唯一

B、default可以省略

C、switch表达式可以是浮点型

D、case语句后不加break会穿透执行答案:C解析:switch的判断表达式只能是整型、字符型、枚举类型,不支持浮点型和字符串类型。9、static修饰全局变量的作用是?A、变量值不可修改

B、仅限当前源文件使用,外部文件无法引用

C、变量存储在栈区

D、程序结束后释放内存答案:B解析:static修饰全局变量,作用域限定为当前.c文件,其他文件无法通过extern引用;普通全局变量可跨文件使用。static变量存储在全局区,程序运行期间不释放。10、以下哪个不是C语言合法标识符?A、num_1

B、_data

C、123abc

D、max_val答案:C解析:标识符命名规则:只能由字母、数字、下划线组成,不能以数字开头,不能使用系统关键字。二、填空题(5题)1、C语言中,结构体变量的大小遵循______原则。答案:内存对齐解析:为了提升CPU读取数据的效率,结构体成员会按照自身最大成员字节数对齐填充内存。2、栈内存由______自动分配释放,堆内存需要手动通过malloc申请、______释放。答案:系统、free解析:局部变量、函数参数存储在栈区,系统自动管理;动态内存开辟在堆区,必须手动free释放,否则会造成内存泄漏。3、指针变量p++移动的字节数由______决定。答案:指针指向的数据类型解析:int*p,p++移动4字节;char*p,p++移动1字节,指针偏移步长依赖指向类型。4、宏定义#defineSUM(a,b)a+b,执行SUM(1+2,3)的结果是______。答案:6解析:宏是纯文本替换,替换后为1+2+3,计算结果为6;若为#defineSUM(a,b)(a)+(b)结果一致,复杂运算需加括号避免优先级问题。5、函数递归的两个必要条件是______和______。答案:递归出口(终止条件)、递归递推公式解析:无递归出口会造成无限递归,导致栈溢出。三、判断题(5题,对√错×)1、数组名是常量指针,不能被赋值修改。()答案:√解析:数组名代表数组首地址,是地址常量,不支持a++、a=NULL这类修改操作。2、malloc申请的内存初始值为0。()答案:×解析:malloc仅开辟内存空间,不初始化,内存值为随机脏值;calloc开辟的内存会自动初始化为0。3、全局变量和静态局部变量都存储在全局数据区。()答案:√解析:普通局部变量在栈区,全局变量、static修饰的变量都在全局区,程序运行全程有效。4、指针为空指针和野指针是同一个概念。()答案:×解析:空指针是赋值为NULL的指针,地址可控、安全;野指针是未初始化、指向随机非法地址的指针,会导致程序崩溃,极其危险。5、break语句可以跳出所有嵌套循环。()答案:×解析:break只能跳出当前所在的单层循环,无法跳出多层嵌套循环;多层循环可通过标志位终止。四、简答题(5题,面试高频)1、简述栈、堆、全局区的区别?答案:1.栈区:由系统自动分配释放,空间小、速度快。存储局部变量、函数参数、函数返回地址。函数执行结束后,栈内存立即释放。2.堆区:手动申请手动释放,空间大、速度稍慢。由malloc、calloc、realloc开辟,free释放。程序结束前未释放会造成内存泄漏,可跨函数使用。3.全局区:存储全局变量、static静态变量。程序启动时分配,程序结束后释放,整个程序运行期间有效,所有函数均可访问。2、野指针产生的原因及如何规避?答案:产生原因:指针未初始化、指针指向的内存已释放仍继续使用、指针越界访问。规避方法:①指针定义时初始化为NULL;②动态内存释放后立即将指针置空;③严格控制指针访问范围,避免数组、内存越界;④使用指针前先判断是否为NULL。3、const和#define的区别?答案:1.处理阶段:#define是预处理阶段文本替换,无类型检查;const是编译阶段处理,有严格数据类型检查。2.内存占用:#define不占用内存,仅替换文本;const变量会在内存中开辟空间。3.作用域:#define作用域从定义处到文件结尾;const变量遵循变量作用域规则。4.调试:const变量可调试查看值,宏定义无法调试。4、结构体和联合体的区别?答案:1.内存存储:结构体成员独立占用内存,互不重叠,总大小遵循内存对齐;联合体所有成员共用同一块内存,同一时间只能存储一个成员的值。2.大小区别:结构体大小大于等于所有成员大小之和;联合体大小等于最大成员的字节大小。3.使用场景:结构体用于存储一组不同类型的关联数据;联合体用于节省内存、同一空间复用场景。5、函数参数传值和传地址的区别?答案:1.传值:传递变量的数值副本,函数内部修改参数值,不会影响外部原变量。开销小,适合基础数据类型。2.传地址(传指针):传递变量的内存地址,函数内部通过地址修改数据,会直接修改外部原变量。无需拷贝数据,适合数组、结构体等大数据类型,可实现函数多返回值。五、编程题(2道,带完整代码+解析)1、编写代码,实现交换两个整数的值(用指针实现)PlainText

#include<stdio.h>

//指针传参,修改原变量

voidswap(int*a,int*b)

{

inttemp=*a;

*a=*b;

*b=temp;

}

intmain()

{

intx=10,y=20;

printf("交换前:x=%d,y=%d\n",x,y);

swap(&x,&y);

printf("交换后:x=%d,y=%d\n",x,y);

return0;

}解析:普通传值无法修改实参,必须通过指针传递变量地址,解引用后修改原内存数据,完成数值交换。2、编写代码,实现计算字符串长度(不使用strlen库函数)PlainText

#include<stdio.h>

intmy_strlen(char*str)

{

intlen=0;

//遍历字符串,直到结束符'\0'

while(str[len]!='\0')

{

len++;

}

returnlen;

}

intmain()

{

charbuf[]="helloc";

intres=my_strlen(buf);

printf("字符串长度:%d\n",res);

return0;

}解析:C语言字符串以'\0'作为结束标志,通过循环逐个遍历字符,计数至结束符即可得到有效字符串长度,不包含结束符本身。六、易错问答题(面试压轴)1、为什么局部数组不能用return返回?答案:局部数组存储在栈区,函数执行结束后,栈内存会被系统立即回收销毁,数组内存空间失

温馨提示

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

评论

0/150

提交评论