C语言----动态内存管理(2)

本文讲述了动态内存管理中的常见问题,如malloc失败后的处理、越界访问、释放内存的规则、内存泄露、栈区和堆区的区别,以及如何正确传递和管理内存以避免错误。
摘要由CSDN通过智能技术生成

1.这里总结动态内存管理里面的错误

(1)使用malloc开辟空间以后直接赋值

这个就是malloc开辟失败返回空指针,直接给空指针赋值就是错误的,

tip1:使用malloc开辟空间以后一定要判断是否为空

(2)

越界访问:一共20字节,一循环20*4=80字节,造成越界访问

(3)释放非动态开放

(4)释放动态内存的一部分

这里指针虽然移动了,但是不能从中间某个位置开始释放,只会从头

(5)对一块空间多次释放

这个的解决方案就是及时置为NULL,这样第二次的释放就不起作用了

(6)内存忘记释放(内存泄露)

动态内存空间,只有2种方式还回去,一种是free释放,2是程序退出

这个在函数里面,出作用域以后就没了,所以会出现内存泄漏,应该及时释放,或者让主函数知道

2.笔试题目

#######(1)

传递str变量本身,只有把地址取出来才是传递地址

--1.getmemory里面的形参开辟了空间,但是对test里面的实参没有影响

---2.这里面相当于对空指针解引用,程序会崩溃,因为要想拷贝,就要*dest=*src,相当于对空指针

进行解引用操作

---3.开辟的空间,没有释放,存在内存泄漏

----4.printf(str)实际上给的是首个元素的地址,所以跟打印字符串的效果是一样的

这个是修改方案

(1)这里无非就是想把开辟的80字节给str,我们传地址就可以了,然后使用二级指针进行接收

(2)这样传递地址就可以把80字节空间给str,这个时候我们依然可以释放空间,置为空指针

######2.

(1)显然,这里是随机值,

(2)数组名是数组首个元素的地址,p向内存申请空间,返回地址,我们可以知道地址,可以找到

这块空间,但是他的生命周期结束,内存还给操作系统,访问就相当于野指针。

(3)这种问题就是访问栈空间的地址问题,其实最简单的就是局部变量,如下:

########3.

这里是可以输出的,问题就是没有free释放,释放之后置为空指针,打印之后应该释放掉;

#######4.

(1)开辟100字节空间,但是释放之后需要置为空指针

3.脑图

4.内存区域分配

在栈区创建,会自动销毁,但是malloc,realloc等开辟的空间放在堆区,需要程序员手动释放

普通的局部变量在栈区开辟空间,static修饰了以后放在数据段,也就是静态区,这些在程序结束

才会销毁,所以他的生命周期比较长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值