C语言中内存相关面试题_第1页
C语言中内存相关面试题_第2页
C语言中内存相关面试题_第3页
全文预览已结束

下载本文档

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

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论