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

下载本文档

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

文档简介

C语言经典面试题及详细答案(实战版)本套试题贴合企业一线C语言面试场景,涵盖基础语法、指针、内存、结构体、程序逻辑、易错点等核心考点,题型分为选择题、程序输出题、编程题、简答题,答案详细易懂,无冗余话术,适合面试自测、笔试考核使用。一、单项选择题(共10题)1.以下关于C语言变量作用域的说法,正确的是()A.全局变量只能定义在main函数之前B.局部变量在函数执行结束后会自动释放内存C.静态局部变量存储在栈区D.全局变量默认初始值为随机值答案:B解析:全局变量可定义在函数外部任意位置,A错误;静态局部变量存储在静态存储区,C错误;全局变量、静态变量默认初始值为0,D错误;局部变量存储在栈区,函数调用结束后栈帧销毁,变量内存自动释放,B正确。2.以下关键字中,不能用来修饰局部变量的是()A.constB.staticC.externD.register答案:C解析:extern用于声明外部全局变量或函数,仅作声明、不分配内存,不能修饰局部变量;const修饰只读变量,static修饰静态局部变量,register修饰寄存器变量,均可用于局部变量。3.32位系统下,int*p;sizeof(p)的结果是()A.4B.8C.2D.不确定答案:A解析:32位系统中,指针变量占用4字节,64位系统占用8字节。sizeof(指针)获取的是指针本身的大小,与指针指向的数据类型无关。4.以下关于数组的说法错误的是()A.数组名是首元素地址,是常量指针,不能被赋值B.字符数组可以存放字符串C.二维数组在内存中是连续存储的D.可以用变量定义数组长度,如intn=5;intarr[n];答案:D解析:标准C语言(C89)不支持变长数组,数组长度必须是常量;C99标准支持变长数组,但企业开发中默认遵循C89规范,该写法不通用、不推荐,属于错误写法。5.联合体和结构体相比,核心特点是()A.成员变量内存独立分配B.所有成员共用同一块内存空间C.联合体占用内存更大D.联合体不能包含指针成员答案:B解析:结构体成员独立分配内存,总内存为所有成员内存之和(包含内存对齐);联合体所有成员共用同一块内存,总内存为最大成员的内存大小。联合体可包含指针成员,且占用内存远小于结构体。6.以下switch语句写法正确的是()A.switch(3.5)B.switch('a')C.case1.5:D.case1-2:答案:B解析:switch括号内表达式、case后常量必须是整型或字符型(整数类型),不支持浮点型、表达式。A为浮点型,C为浮点型,D为表达式,均错误;字符型本质是ASCII整型,B正确。7.以下不会造成内存泄漏的操作是()A.malloc后未freeB.realloc扩容后未释放原内存C.定义普通局部数组变量D.动态开辟内存,指针指向改变答案:C解析:普通局部数组存储在栈区,函数结束后自动释放内存,无内存泄漏;malloc/realloc开辟的是堆区内存,需手动free释放,指针丢失或未释放都会造成内存泄漏。8.宏定义#defineDIV(a,b)a/b,执行intx=DIV(2+3,5);结果为()A.1B.2.6C.2.2D.0答案:A解析:宏是纯文本替换,无运算优先级处理。替换后式子为2+3/5,先算除法3/5=0(整数除法),再算加法2+0=2?修正:正确替换结果为2+3/5,整数运算结果为2,标准答案应为2,本题选项修正:正确结果为2。核心考点:宏替换不自动加括号,极易产生逻辑错误。9.函数形参传递中,地址传递的作用是()A.节省代码空间B.可以修改实参的原始数据C.提高代码运行速度D.避免参数拷贝答案:B解析:值传递仅拷贝数据,无法修改实参;地址传递传递变量内存地址,通过地址可以直接操作、修改原始实参数据。D选项为地址传递的次要作用,核心作用是修改实参。10.以下关于break和continue说法正确的是()A.continue可以跳出循环B.break只能跳出for循环C.continue结束本次循环,进入下一次循环D.break可以跳出if语句答案:C解析:break用于跳出当前循环(for/while/do-while)或switch语句;continue仅结束本次循环,直接进入下一次迭代;if是判断语句,break无法跳出if。二、程序输出题(含详细解析)1.写出以下程序运行结果PlainText

#include<stdio.h>

intmain()

{

inta=10;

intb=++a+a++;

printf("%d%d",a,b);

return0;

}输出结果:1222解析:++a为先自增后运算,a初始10,++a后a=11;a++为先运算后自增,取值11,此时求和11+11=22;运算结束后a再自增1,最终a=12。2.写出以下程序运行结果PlainText

#include<stdio.h>

intmain()

{

charstr[]="abcdef";

char*p=str;

printf("%d%d",sizeof(str),sizeof(p));

return0;

}输出结果:74(32位系统)、78(64位系统)解析:str是字符数组,sizeof计算数组总长度,包含末尾'\0'结束符,6个字符+1个结束符共7字节;p是字符指针,指针大小由系统位数决定,与指向的字符串无关。3.写出以下程序运行结果PlainText

#include<stdio.h>

voidfun(intx)

{

x=100;

}

intmain()

{

inta=10;

fun(a);

printf("%d",a);

return0;

}输出结果:10解析:本题为值传递,函数形参x是实参a的临时拷贝,修改x的值不会影响原始实参a,因此a的值保持不变。4.写出以下程序运行结果PlainText

#include<stdio.h>

intmain()

{

inti=0;

for(;i<3;i++)

{

staticinta=0;

a++;

}

printf("%d",a);

return0;

}输出结果:3解析:静态局部变量static仅初始化一次,生命周期贯穿整个程序。循环执行3次,a依次自增为1、2、3,循环结束后a保留最终值3。三、简答题(核心面试考点)1.简述栈、堆、静态存储区的区别答案:1.栈区:由系统自动分配、自动释放,存储局部变量、函数参数、函数返回地址等;空间固定、读写速度快,栈空间有限,过大局部变量会导致栈溢出。2.堆区:由程序员手动开辟(malloc/calloc/realloc)、手动释放(free),全程可控;空间大、灵活,可动态调整大小,未手动释放会造成内存泄漏,程序结束后系统自动回收。3.静态存储区:存储全局变量、静态变量(static修饰);程序运行期间全程存在,程序结束后释放;默认初始值为0,仅初始化一次。2.指针和数组名的区别是什么?答案:1.本质不同:数组名是数组首元素的常量地址,不可被赋值、不可自增自减;指针是变量,可以修改指向、可自增自减。2.sizeof结果不同:sizeof(数组名)得到数组总内存大小;sizeof(指针)得到指针变量本身的大小(4/8字节)。3.存储方式不同:数组名对应一块连续的内存空间;指针仅存储一个地址值,本身不存储数据。4.赋值规则不同:数组名不能直接赋值,指针可以随意修改指向。3.什么是内存对齐?为什么需要内存对齐?答案:内存对齐是编译器为了提高内存访问效率,自动对结构体、变量的内存地址进行规整化处理,让变量地址为自身字节数的整数倍。作用:1.硬件底层仅支持对齐地址的内存访问,未对齐会触发硬件异常;2.减少CPU读取内存的次数,大幅提升程序运行效率;3.适配不同平台的硬件规范,提高代码可移植性。4.宏定义和函数的区别?答案:1.处理时机不同:宏是预处理阶段纯文本替换,无语法检查;函数是编译运行阶段调用,有严格的语法、参数类型检查。2.运行效率不同:宏无函数调用开销(无栈帧创建、销毁),效率更高;函数调用有额外开销。3.安全性不同:宏无优先级、无类型检查,容易产生逻辑漏洞;函数类型严格、安全性高。4.代码体积不同:宏每次使用都会替换代码,会增加代码体积;函数多次调用仅一份代码,体积更小。5.简述const关键字的作用答案:1.修饰普通变量:变量变为只读,不可修改,防止误操作修改数据。2.修饰指针:constint*p表示指针指向的数据不可改,指针本身可改;int*constp表示指针本身不可改,指向的数据可改。3.修饰函数参数:防止函数内部修改传入的参数数据,保护原始数据。4.修饰函数返回值:限制返回值的修改权限,提升代码安全性和可读性。四、编程实战题(面试高频)1.编写代码,实现字符串反转(不使用库函数)参考答案:PlainText

#include<stdio.h>

voidreverseStr(char*str)

{

//判空

if(str==NULL)

return;

//计算字符串长度

intlen=0;

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

{

len++;

}

//首尾交换反转

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[]="helloworld";

reverseStr(buf);

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

return0;

}2.编写代码,实现冒泡排序(整型数组升序排序)参考答案:PlainText

#include<stdio.h>

voidbubbleSort(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,1,3,7,2,8};

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

bubbleSort(arr,len);

//打印结果

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

{

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

}

return0;

}3.动态内存开辟:输入n个整数,动态存储并打印,最后释放内存参考答案:PlainText

#include<stdio.h>

#include<stdlib.h>

intmain()

{

intn;

printf("请输入数字个数:");

scanf("%d",&n);

//动态开辟堆内存

int*p=(int*)malloc(n*sizeof(int));

if(p==NULL)//判空,防止开辟失败

{

printf("内存开辟失败!\n");

return-1;

}

//输入数据

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

{

scanf("%d",&p[i]);

}

//打印数据

printf("输入的数据为:");

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

{

温馨提示

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

评论

0/150

提交评论