使用malloc不能返回動態記憶體

2021-10-23 22:12:19 字數 1211 閱讀 6800

閱讀此篇前可以先閱讀:指標變數的傳值和傳址

#include

#include

void

getmemory

(char

*p)int

main()

執行結果:程式崩潰,getmemory中的malloc 不能返回動態記憶體, free()對str操作很危險。

當引數是指標時容易忽略,請不要用值傳遞(這樣會導致str沒有指向分配到的記憶體),c語言裡沒有引用的話就用指標傳。

c語言是值傳遞,故在函式呼叫中修改的值,並不會返傳至主調函式。所以原程式在getmemory函式中malloc獲得的位址空間的首位址的值只在函式內部有效,函式呼叫結束後該值就丟失了

傳值是把實參的值拷貝給形參,運算中是對形參進行操作,實參的值在運算中不會發生變化。傳址是把實參的位址傳給形參,運算中是對實參進行操作,會改變實參的值

此段**有錯,getmemory(str)中引數問題。編譯器會為每個函式的引數都複製乙份臨時副本,指標引數 p 的副本在c中是_p,並且對_p賦值為p ,即 _p = p 。如果在getmemory函式體內修改了 _p,則導致引數 p 的內容做相應的修改。這就是指標可用作輸出引數的原因。但此處中getmemory 函式的 _p 申請了新記憶體,此時 _p 所指的記憶體位址改變了,但是 p 沒變。所以每次呼叫getmemory都會造成記憶體洩露。形參p的域只在函式裡有效,p一開始指向你想要的位址,但是當你重新分配記憶體的時候p指向了新的位址,當你返回函式的時候原來的位址還是空的。要在函式裡返回記憶體有兩種辦法,一種是指標的指標 **p ,用這個指標指向乙個需要分配記憶體的值。另外一種方法更簡單,你在函式裡創造乙個指標然後 return他就可以了。

正確寫法:

#include

#include

void

getmemory

(char

**p)

intmain()

void

getmemory

(char

&*p) 或者

void

getmemory

(char

**p)

你那樣做開始str和p指向的一樣是null(即內容一樣),但是p=(char *) malloc(100); 後str仍然是null,但str得到了新的記憶體。

返回動態記憶體 malloc

include include void getmemory char p int main 此段 有錯,getmemory str 中引數問題。編譯器會為每個函式的引數都複製乙份臨時副本,指標引數 p 的副本在c中是 p,並且對 p賦值為p 即 p p 如果在getmemory函式體內修改了 p,...

收回動態VHD的未使用空間

隨著虛擬機器的執行,虛擬機器磁碟所佔空間越來越大,而實際使用並沒有那麼大,考慮 未使用部分。收回動態vhd的未使用空間 壓縮vhd 有一種方法是ghost,兩個vhd檔案對拷。本文不是那個方法 本文是利用diskpart的compact vdisk命令。步驟如下 1 看一下原來的vhd的大小,看一下...

web返回動態響應和靜態響應的區別

web返回的響應 何為響應,響應就是web伺服器根據客戶端的發給他請求的一系列內容做出的回應。靜態響應 當web伺服器接收到這個請求後,從原來已有的資源中給你乙個一成不變的內容,任何請求過來都會傳送相同的內容,不會根據發起請求的物件不同做出不同的回應。動態響應 當web伺服器拿到這個請求後,根據請求...