C语言社招笔试真题(含详细答案解析)_第1页
C语言社招笔试真题(含详细答案解析)_第2页
C语言社招笔试真题(含详细答案解析)_第3页
C语言社招笔试真题(含详细答案解析)_第4页
C语言社招笔试真题(含详细答案解析)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

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

文档简介

C语言社招笔试真题(含详细答案解析)考试说明:满分100分,考试时长90分钟,题型包含选择题、填空题、程序改错题、编程题,适配后端、嵌入式、软件开发社招岗位一、单项选择题(共15题,每题3分,共45分)1.以下关于C语言变量作用域的说法,正确的是()A.全局变量仅在main函数中有效B.局部变量在函数调用结束后会自动销毁C.静态局部变量存储在栈区D.全局变量存储在栈区2.已知inta=2;intb=a+++++a;,则b的值为()A.5B.6C.7D.83.以下关键字中,不能修饰局部变量的是()A.staticB.externC.autoD.register4.关于指针运算,下列代码输出结果为()c

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

int*p=arr;

printf("%d",*(p+2));

A.1B.2C.3D.45.结构体变量默认的内存对齐方式是()A.1字节对齐B.4字节对齐C.按成员最大字节数对齐D.8字节对齐6.以下关于malloc和free的说法,错误的是()A.malloc申请的内存在堆区B.未free的堆内存会造成内存泄漏C.free空指针会程序崩溃D.同一块堆内存不能重复free7.C语言中,char*str="abc";以下操作合法的是()A.str[0]='d';B.*str='1';C.str="def";D.以上都不对8.循环语句for(;;)的执行情况是()A.不执行循环B.无限死循环C.执行一次D.语法报错9.已知unsignedchara=0xff;charb=0xff;,则a、b的值分别为()A.255、-1B.255、255C.-1、-1D.0、010.函数递归调用的核心特点不包括()A.自身调用自身B.必须有终止条件C.占用栈空间D.执行效率高于循环11.以下数组定义方式,合法的是()A.intn=5;intarr[n];B.intarr[];C.intarr[3]={1,2,3,4};D.intarr[2]={1};12.位运算中,要将变量x的第3位清零(其余位不变),正确的写法是()A.x&=~(1<<2)B.x|=(1<<3)C.x^=(1<<2)D.x&=~(1<<3)13.下列关于宏定义的说法正确的是()A.宏定义会做类型检查B.宏替换在编译预处理阶段执行C.宏定义可以递归定义D.宏定义末尾必须加分号14.局部变量和全局变量重名时,下列说法正确的是()A.全局变量优先B.局部变量优先C.程序报错D.随机取值15.以下代码的输出结果是()c

#include<stdio.h>

intmain(){

inti=0;

switch(i){

case0:i++;

case1:i++;break;

case2:i++;

}

printf("%d",i);

return0;

}

A.1B.2C.3D.0二、填空题(共5题,每题3分,共15分)1.C语言中,程序入口函数是________,一个C程序最多有________个该函数。2.指针变量int*p的本质是存储________的变量,32位系统下,所有指针变量的字节大小为________字节。3.结构体structTest{chara;intb;};在4字节对齐环境下,占用内存大小为________字节。4.#defineSUM(a,b)a+b,执行intres=SUM(2,3)*4;,res的值为________。5.字符串"hello\n"在内存中占用的字节数是________。三、程序改错题(共2题,每题8分,共16分)要求:找出代码中所有错误,说明错误原因,并写出修正后的完整代码1.字符串拷贝功能代码改错c

#include<stdio.h>

voidstrCopy(char*dst,char*src){

while(*src!='\0'){

*dst=*src;

dst++;

src++;

}

}

intmain(){

char*s1="12345";

chars2[10];

strCopy(s2,s1);

printf("%s",s2);

return0;

}

2.动态内存分配代码改错c

#include<stdio.h>

#include<stdlib.h>

intmain(){

int*p=(int*)malloc(4);

p=NULL;

free(p);

return0;

}

四、编程题(共2题,每题12分,共24分)1.编写C语言函数,实现字符串反转功能,不使用库函数,在主函数中测试(输入任意字符串,输出反转后的字符串)。2.编写程序,找出1-100之间所有的素数,并逐行打印输出。参考答案及详细解析一、单项选择题答案解析1.答案:B解析:全局变量作用域为整个工程,存储在全局数据区;静态局部变量存储在全局数据区;局部变量存储在栈区,函数执行结束后栈内存释放,局部变量销毁。2.答案:A解析:后置先取值后自增,前置先自增后取值。执行流程:a初始为2,a++先取出2参与运算,a变为3;++a先自增为4,最终2+3=5(运算时a++取2,++a取3)。3.答案:B解析:extern用于声明外部全局变量/函数,不能定义局部变量;static修饰静态局部变量,auto为局部变量默认属性,register为寄存器局部变量。4.答案:C解析:数组名是首元素地址,p指向arr[0],p+2跳过两个int元素,指向arr[2],取值为3。5.答案:C解析:C语言结构体默认对齐规则:按结构体中占用字节数最大的成员进行内存对齐。6.答案:C解析:free函数支持释放空指针(NULL),不会报错崩溃;重复free、释放野指针会导致程序崩溃,未释放堆内存会造成内存泄漏。7.答案:C解析:"abc"是字符串常量,存储在只读数据区,无法修改内容(A、B错误);str是指针变量,可以修改指针指向的地址,因此str="def"合法。8.答案:B解析:for循环三个表达式均可省略,省略后判定条件恒为真,构成无限死循环。9.答案:A解析:unsignedchar无符号,0xff对应十进制255;char为有符号字符型,最高位为符号位,0xff是补码,对应真值-1。10.答案:D解析:递归每次调用都会开辟栈帧,存在栈开销,执行效率低于普通循环,递归优势是代码简洁,适合拆解重复性层级问题。11.答案:D解析:C语言标准不支持变长数组(A错);数组定义必须指定长度或初始化赋值(B错);初始化元素个数不能大于数组长度(C错);数组初始化可部分赋值,剩余元素自动补0(D正确)。12.答案:A解析:二进制位从0开始计数,第3位对应偏移量2;清零操作使用与运算,配合取反掩码,1<<2得到第3位为1的数,取反后与x与运算,即可清零指定位。13.答案:B解析:宏替换是纯文本替换,无类型检查、不支持递归定义,末尾不能加分号;替换动作在编译预处理阶段完成。14.答案:B解析:变量重名时,遵循“局部优先”原则,局部变量会屏蔽全局变量。15.答案:B解析:i=0匹配case0,i自增为1,无break,穿透执行case1,i再次自增为2,break跳出循环,最终输出2。二、填空题答案解析1.main、1解析:main函数是C程序唯一入口,一个完整C程序有且仅有一个main函数。2.变量内存地址、4解析:指针的核心是存储地址;32位系统地址总线为32位,所有指针均占4字节,64位系统占8字节。3.8解析:char占1字节,补齐4字节对齐,int占4字节,总大小4+4=8字节。4.14解析:宏纯文本替换,SUM(2,3)*4替换为2+3*4=14,并非(2+3)*4。5.7解析:字符串包含h、e、l、l、o、\n,外加末尾自动补的结束符\0,共7个字节。三、程序改错题答案解析第一题错误点及修正1.核心错误:拷贝结束后,未给目标字符串添加结束符\0,会导致字符串乱码;2.隐患错误:未做参数合法性校验,若src/dst为空指针会崩溃。c

#include<stdio.h>

voidstrCopy(char*dst,char*src){

//增加空指针判断

if(dst==NULL||src==NULL){

return;

}

while(*src!='\0'){

*dst=*src;

dst++;

src++;

}

//手动添加字符串结束符

*dst='\0';

}

intmain(){

char*s1="12345";

chars2[10];

strCopy(s2,s1);

printf("%s",s2);

return0;

}

第二题错误点及修正1.内存泄漏:malloc申请堆内存后,直接给p赋值NULL,丢失堆内存地址,无法释放;2.无效释放:释放空指针无意义,属于代码冗余问题;3.规范问题:malloc需要判断申请内存是否成功。c

#include<stdio.h>

#include<stdlib.h>

intmain(){

int*p=(int*)malloc(4);

//判断内存申请是否成功

if(p==NULL){

printf("内存申请失败\n");

return1;

}

//正常使用内存

*p=10;

printf("%d\n",*p);

//释放堆内存

free(p);

//释放后置空指针,避免野指针

p=NULL;

return0;

}

四、编程题参考答案第一题:字符串反转(无库函数)c

#include<stdio.h>

//自定义字符串长度计算

intgetLen(char*str){

intlen=0;

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

len++;

}

returnlen;

}

//字符串反转函数

voidstrReverse(char*str){

if(str==NULL){

return;

}

intlen=getLen(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[100];

printf("请输入字符串:");

scanf("%s",buf);

strReverse(buf);

printf("反转后字符串:%s\n",buf);

return0;

}

第二题:打印1-100素数c

#include<stdio.h>

//判断是否为素数:是返回1,否返回0

intisPrime(intn){

//1和负数不是素数

if(n<2){

return0;

}

//只需遍历到根号n,

温馨提示

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

评论

0/150

提交评论