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修饰了以后放在数据段,也就是静态区,这些在程序结束
才会销毁,所以他的生命周期比较长。