啊C啊C我爱你面试题-4

常考面试题

  1. 请说说内存分布模型⭐⭐⭐⭐⭐

img

如上图,从低地址到高地址,一个程序由代码段、数据段、BSS段、堆栈段组成。

  1. 代码段:存放程序执行代码的一块内存区域。只读,不允许修改,代码段的头部还会包含一些只读的常量,如字符串常量字面值(注意:const变量虽然属于常量,但是本质还是变量,不存储于代码段)。

  2. 数据段data:存放程序中已初始化全局变量静态变量的一块内存区域。

  3. BSS 段:存放程序中未初始化全局变量静态变量的一块内存区域。

  4. 可执行程序在运行时又会多出两个区域:堆区栈区。

    **堆区:**动态申请内存用。堆从低地址向高地址增长。

    栈区:存储局部变量函数参数值。栈从高地址向低地址增长。是一块连续的空间。

  5. 最后还有一个文件映射区(共享区),位于堆和栈之间。

  6. 堆和栈的区别⭐⭐⭐⭐⭐

    1. 堆栈空间分配不同。栈由操作系统自动分配释放 ,存放函数的参数值局部变量的值等,栈有着很高的效率;堆一般由程序员分配释放,堆的效率比栈要低的多
    2. 堆栈缓存方式不同。栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放;堆则是存放在二级缓存中,速度要慢些。
    3. 空间大小: 栈的空间大小并不大,一般最多为2M,超过之后会报Overflow错误。堆的空间非常大,理论上可以接近3G。(针对32位程序来说,可以看到内存分布,1G用于内核空间,用户空间中栈、BSS、data又要占一部分,所以堆理论上可以接近3G,实际上在2G-3G之间)。
    4. 能否产生碎片: 栈的操作与数据结构中的栈用法是类似的。‘后进先出’的原则,以至于不可能有一个空的内存块从栈被弹出。因为在它弹出之前,在它上面的后进栈的数据已经被弹出。它是严格按照栈的规则来执行。但是堆是通过new/malloc随机申请的空间,频繁的调用它们,则会产生大量的内存碎片。这是不可避免地。
  7. 请你说说野指针⭐⭐⭐⭐⭐

    野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

    野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不能通过指针判空去识别一个指针是否为野指针。

    出现野指针的情况:

    1. 指针变量的值未被初始化: 声明一个指针的时候,没有显示的对其进行初始化,那么该指针所指向的地址空间是乱指一气的。如果指针声明在全局数据区,那么未初始化的指针缺省为空,如果指针声明在栈区,那么该指针会随意指向一个地址空间。
    2. 指针所指向的地址空间已经被free或delete:在堆上malloc或者new出来的地址空间,如果已经free或delete,那么此时堆上的内存已经被释放,但是指向该内存的指针如果没有人为的修改过,那么指针还会继续指向这段堆上已经被释放的内存,这时还通过该指针去访问堆上的内存,就会造成不可预知的结果,给程序带来隐患。
    3. 指针操作超越了作用域
  8. 如何避免野指针⭐⭐⭐⭐⭐

    (1)初始化置NULL

    (2)申请内存后判空:ma

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

<p> - 本专刊适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专刊适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 - 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共近400道,知识点讲解全面。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。 </p> <p> <br /> </p>

全部评论
c语音拜拜了
5 回复 分享
发布于 2021-04-12 17:26
“6.堆内存申请需要注意什么?” 是否改为“在函数中申请堆内存需要注意什么?”更加合适emm
2 回复 分享
发布于 2021-12-24 17:58
在介绍堆和栈的区别时对比了是否会产生碎片,其中说到栈不会产生碎片,是不是因为栈中空间在分配时遵循先进后出原则,不会将空内存出栈,所以内存一定是连续被申请的,但是也有可能最后栈中剩下一块空间不足以存放新的数据的大小,这时候栈内存就会产生碎片了吧
点赞 回复 分享
发布于 2021-06-26 15:07
malloc申请内存后做判空操作,是因为怕malloc申请内存失败吗?我们一开始先给一个指针初始化,让指针指向NULL,然后让这个指针指向malloc申请的那块内存空间,如果malloc申请内存成功,该指针可以指向这块内存,但如果malloc申请失败了,这个指针仍然还是指向NULL的,所以写完malloc之后,判断指针是否为NULL是为了判断malloc申请内存是否成功,我得理解对吗,请问
点赞 回复 分享
发布于 2021-06-27 10:42
堆栈缓存方式不同。栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放;堆则是存放在二级缓存中,速度要慢些。【???】 这段话不懂什么意思,能解释一下什么一级缓存二级缓存吗?
点赞 回复 分享
发布于 2021-09-14 12:08
请问,“栈的空间大小并不大,一般最多为2M,超过之后会报Overflow错误。堆的空间非常大,理论上可以接近3G。(针对32位程序来说,可以看到内存分布,1G用于内核空间,用户空间中栈、BSS、data又要占一部分,所以堆理论上可以接近3G,实际上在2G-3G之间)。” 这里应该是针对内存为4G的情况举的例子吧?
点赞 回复 分享
发布于 2021-12-24 17:41
12、直接从堆区申请一块合适的空闲快(块),错别字,老哥,,,一会再见C,进入C++
点赞 回复 分享
发布于 2023-03-21 20:31 甘肃
这里的序号是不是乱了,第1题是“请说说内存分布模型”,然后下一题的序号就变成第6题(第一题里面罗列了5个点,然后本来应该是第二题的变成了第6题)😁
点赞 回复 分享
发布于 2024-10-28 16:11 广东

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务