下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言中内存相关面试题
其中全局静态区和文字常量区在程序运行时始终保存,直到程序结束被销毁,而栈内数据在函数返回时被全部销毁。堆中数据由程序员手动安排并要求手动释放,否则会造成内存泄露。
函数调用主要分为建立堆栈获得入口地址、安排内存、执行、返回四个部分,其中形参入栈一般时从右至左的挨次。
面试题
1.内存中不同区域的识别
charc[]=123;
c[0]=X;
由于字符串'123'是通过数组charc[]来安排内存,因此被安排在栈区
char*p=123;
p[0]=X;
指针char*p可以指向任意类型的内存块,"123'被安排在文字常量区。而常量区内存是不允许被修改的,因此执行p[0]=X会消失运行时错误runtimeerror。
char*a=hello;
char*b=hello;
if(a==b)
printf(YES);
else
printf(NO);
这题看起来比较简洁,'hello'位于文字常量区,a和b都是指向它的地址,应当是相等的。但这是编译器优化的状况,假如编译器没有优化,在文字常量区建立了两个'hello'常量,那么就是两个不同的地址,a和b自然也就不相等。
2.栈区数据在函数返回时被销毁
char*func1()
{
charp[]=helloworld;
returnp;
}
char*func2()
{
char*p=helloworld;
returnp;
}
intmain(intargc,char*argv[])
{
char*p=func1();
printf(%s\n,p);
p=func2();
printf(%s\n,p);
return0;
}
先想象下两次打印的结果都是'helloworld'吗?
函数func1中的字符数组p[]为函数内的局部变量,存储在栈区,在函数返回后,内存已经被释放。func1返回的p指向的那一块内存已经被释放,可能被写入了其他数据,此时通过printf("%s\n',p)来访问数据是非法的,结果更是不行预知的',可能导致程序崩溃。
而func2中的'helloworld'由于保存在文字常量区,因此在函数func2返回后没有被销毁,可以正常打印出结果。
最终附上执行结果:
3.函数调用中形参的传递
voidGetMemory(char*s)
{
s=(char*)malloc(10);
strcpy(s,abc);
printf(infunc:s=%s\n,s);
}
intmain(intargc,char*argv[])
{
char*str=NULL;
GetMemory(str);
printf(outfunc:s=%s\n,str);
return0;
}
这里关键在于如何理解函数GetMemory中的形参char*s,函数在执行过程中会将形参s入栈,为其安排内存空间,也就是说这里的s和调用时的GetMemory(str)中的str完全不同,这里的s只不过是str的一个拷贝。
s是个指针,也就是个32位的unsignedint,只是保存了一个地址。在函数GetMemory中调用malloc在堆上安排了内存,新安排内存的地址拷贝到s中,但是并没有拷贝到原先的str中。因此指针str仍旧没有指向新安排内存,所以str并没有转变,打印的仍旧是空值。
最终附上执行结果:
commet:这题需要好好理解下,很多初学者单纯地认为带了*的就是传入了指针可以转变变量值
4.函数调用中形参入栈的挨次
voidfunc(inta,intb)
{
printf(%d,%d\n,a,b);
}
intmain(intargc,char*argv[])
{
intx=10;
func(x,x++);
return0;
}
输出什么???
A.(10,10)
B.(10,11)
C.(11,10)
D.(11,11)
函数执行时,首先建立栈区获得入口地址,然后将形参入栈,这里需要留意的是,函数形参一般根据从右向左的挨次入栈。所以func(x,x++)中b对应的x++先入栈,此时其次个形参b的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年小课题教案书写
- 2025-2026学年开封市直招教教学设计
- 2025-2026学年英语大单元教学设计疑问
- 2025-2026学年大班《文具安全》教案
- 2025-2026学年教案泥塑火锅
- 印染染化料配制工岗前技术理论考核试卷含答案
- 2026年广西交通职业技术学院单招职业倾向性考试题库附答案详解(轻巧夺冠)
- 2025-2026学年幼儿篮球教案网站
- 2026年广州城建职业学院单招综合素质考试题库含答案详解ab卷
- 2026年广东江门中医药职业学院单招职业技能测试题库及完整答案详解1套
- 山东潍坊市2025-2026学年高二上学期学业质量监测语文试题(含答案)(含解析)
- 2026云南楚雄高新技术产业开发区消防救援大队招聘7人笔试备考试题及答案解析
- 安全生产违法行为处罚办法解读课件
- 教会教牧考勤制度
- 介入治疗围手术期疼痛管理专家共识2026
- 小学数学新人教版二年级下册第一单元 有余数的除法教案(2026春)
- 四川美捷森电路技术有限公司高精密双面多层电路板产业化项目环评报告
- 感动中国2025十大人物事迹及颁奖词
- 2026内蒙古地质矿产集团有限公司社会招聘65人笔试参考题库及答案解析
- 2026年春冀教版(新教材)小学数学二年级下册教学计划及进度表
- 2026年春季苏教版小学数学三年级下册教学计划含进度表
评论
0/150
提交评论