返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...
1、指針變量作為參數進行值傳遞給函數的形參,并在堆區(Heap)進行內存分配和賦值
程序源碼:
1
結果:
Segmentation fault (core dumped)
分析:
如上圖,指針變量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
分析:
如上圖,指針變量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
分析:
總結
以上是生活随笔為你收集整理的返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机当电脑音响_hifi迷你组合音响怎么
- 下一篇: tensorflow官方文档_Tenso