𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: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指向的空间还给系统之后,恰巧赶上没有其他的占用
结语:
相信大家对动态内存管理应该有了自己的一定了解了吧,希望给位老铁可以有自己的一个新的体悟。