返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...
1、指針變量作為參數(shù)進(jìn)行值傳遞給函數(shù)的形參,并在堆區(qū)(Heap)進(jìn)行內(nèi)存分配和賦值
程序源碼:
1
結(jié)果:
Segmentation fault (core dumped)
分析:
如上圖,指針變量ptr進(jìn)行值傳遞給函數(shù)allocation()的形參tmp并賦值為NULL,這里只是將指針ptr進(jìn)行值傳遞即將NULL賦給tmp而不是指向tmp,所以ptr還是指向NULL,然后tmp在堆區(qū)(Heap)進(jìn)行了內(nèi)存分配并賦值為100,這里分配的堆區(qū)的內(nèi)存地址為0xaabb,由于tmp是局部變量,在第13行執(zhí)行完allocation()函數(shù)后位于棧區(qū)的tmp就會(huì)自動(dòng)釋放,但是tmp所指向堆區(qū)的內(nèi)存空間0xaabb是不會(huì)釋放的,只能手動(dòng)釋放(使用free()函數(shù))或者等程序全部運(yùn)行結(jié)束后才會(huì)釋放,如果不釋放的話就會(huì)造成內(nèi)存泄漏,所以*ptr就相當(dāng)于對(duì)野指針NULL進(jìn)行取值。
2、指針變量先在堆區(qū)(Heap)分配內(nèi)存空間,然后作為參數(shù)值傳遞給函數(shù)賦值
程序源碼:
1
結(jié)果:
*ptr = 100
分析:
如上圖,指針變量ptr先在堆區(qū)(Heap)進(jìn)行內(nèi)存分配,地址為為0xaabb,接著將ptr的值也就是地址0xaabb作為參數(shù)進(jìn)行值傳遞賦值給tmp,這里tmp也指向了0xaabb并對(duì)該地址賦值為100,執(zhí)行完allocation(ptr)函數(shù)后因?yàn)閠mp是局部變量存在于棧區(qū),所以tmp就會(huì)自動(dòng)釋放內(nèi)存,但是ptr依舊指向0xaabb,此時(shí)打印*ptr時(shí)由于之前tmp對(duì)ptr所指向的地址0xaab已經(jīng)賦值為100了,所以*ptr就等于100。
3、在函數(shù)里對(duì)局部變量進(jìn)行堆區(qū)(Heap)的內(nèi)存分配和賦值,并返回該堆區(qū)空間的地址
程序源碼:
1
結(jié)果:
*ptr = 100
分析:
總結(jié)
以上是生活随笔為你收集整理的返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机当电脑音响_hifi迷你组合音响怎么
- 下一篇: tensorflow官方文档_Tenso