閱讀此篇前可以先閱讀:指標變數的傳值和傳址
#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伺服器拿到這個請求後,根據請求...