动态内存面试的经典题目

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑


前言:

各位老铁们,咱可千万不要忽视动态内存相关知识点的学习,因为后期数据结构主要是在内存上进行数据的管理,这就不可避免的用到动态内存的知识点,而且很容易出现内存的报错

所以对这方面的练习是不可避免滴

 题目一:

 来看一下这个程序能否正常跑起来?那么输出的结果是啥?若是不能那么这个程序面临什么问题?

 分析如下:

1)代码第11行:并没有实现为str开辟空间

  这就涉及到了传值传参的问题:因为想要改变str这个指针变量的值,我需要传对应的地址 &str ,而不是传str这个变量

2)代码第12行:对空指针的解引用

因为此时str是指向NULL

3)内存泄漏:malloc出来的空间没有释放

4)最终:程序并不会打印  hello world 

改正之后的程序

 题目二:

 

 对于这个问题:我相信会有一些老铁们说这不就打印 hello world 

分析如下:

 典型问题:返回栈空间地址

1)返回栈空间地址:对于GetMemmory函数里的数组p(局部变量),当出了GetMemory函数,p指向的那个空间就会还给系统,原有的内容覆盖掉

2)非法访问:代码第34行

此时str仍然是可以拿到p对应的那个地址(虽然p指向的空间还给系统,但p没有置空),这时就造成非法访问了

 题目三:

分析如下:

相信在对题目一的理解,这个自然就so easy

程序可以正常运行

注意:对于堆上开辟出来的空间(动态开辟的)要不free释放要么就是程序结束自动释放

但是有没有想过这样一个问题:对于那种 7*24小时跑的程序会释放空间吗?这不就造成内存泄露了嘛

内存泄漏:malloc出来的空间忘记释放

 题目四:

分体如下:

 非法访问:代码第60行

str本省已经被free了,他所指向下那块空间已经归还给了系统,但是str并没有置空,所以代码60再次对他进行访问,就造成了非法访问

但是有老铁就说了,那为什么程序可以正常打印world呢?

这就涉及到了函数栈帧的创建与销毁的知识了

可能是:此时str指向的空间还给系统之后,恰巧赶上没有其他的占用

 结语:

相信大家对动态内存管理应该有了自己的一定了解了吧,希望给位老铁可以有自己的一个新的体悟。

  • 36
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值