返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...

本文探讨了两种不同的指针作为参数传递给函数的情况,分析了内存分配、释放以及可能引发的内存泄漏问题。第一种情况中,指针在函数内部分配内存但未传递其引用,导致外部指针成为野指针,可能出现内存泄漏。第二种情况则涉及指针先分配内存再传递地址,使得函数内部和外部都能访问同一块内存,避免了内存泄漏。文章强调了正确管理内存以防止内存泄漏的重要性。
摘要由CSDN通过智能技术生成

1、指针变量作为参数进行值传递给函数的形参,并在堆区(Heap)进行内存分配和赋值

程序源码:

1 


结果:
Segmentation fault (core dumped)

分析:

c93abfc57a79e63a3a11be760f130e83.png


如上图,指针变量ptr进行值传递给函数allocation()的形参tmp并赋值为NULL,这里只是将指针ptr进行值传递即将NULL赋给tmp而不是指向tmp,所以ptr还是指向NULL,然后tmp在堆区(Heap)进行了内存分配并赋值为100,这里分配的堆区的内存地址为0xaabb,由于tmp是局部变量,在第13行执行完allocation()函数后位于栈区的tmp就会自动释放,但是tmp所指向堆区的内存空间0xaabb是不会释放的,只能手动释放(使用free()函数)或者等程序全部运行结束后才会释放,如果不释放的话就会造成内存泄漏,所以*ptr就相当于对野指针NULL进行取值。

2、指针变量先在堆区(Heap)分配内存空间,然后作为参数值传递给函数赋值

程序源码:

1 


结果:
*ptr = 100

分析:

c39466bae7e761ed44b798c539688007.png


如上图,指针变量ptr先在堆区(Heap)进行内存分配,地址为为0xaabb,接着将ptr的值也就是地址0xaabb作为参数进行值传递赋值给tmp,这里tmp也指向了0xaabb并对该地址赋值为100,执行完allocation(ptr)函数后因为tmp是局部变量存在于栈区,所以tmp就会自动释放内存,但是ptr依旧指向0xaabb,此时打印*ptr时由于之前tmp对ptr所指向的地址0xaab已经赋值为100了,所以*ptr就等于100。

3、在函数里对局部变量进行堆区(Heap)的内存分配和赋值,并返回该堆区空间的地址

程序源码:

1 


结果:
*ptr = 100


分析:

c39466bae7e761ed44b798c539688007.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值