什麼時候需要動態分配記憶體?

2021-06-26 16:56:04 字數 2429 閱讀 8998

我講解一下c語言中動態分配記憶體的函式,可能有些初學c語言的人不免要問了:我們為什麼要通過函式來實現動態分配記憶體呢?系統難道不是會自動分配記憶體嗎??

既然有人會問這樣的問題,那麼我在這裡好好的講解一下吧!

首先讓我們熟悉一下計算機的記憶體吧!在計算機的系統中有四個記憶體區域:1)棧:在棧裡面儲存一些我們定義的區域性變數以及形參(形式引數);2)字元常量區:主要是儲存一些字元常量,比如:char *p_str=」cgat」;其中」cgat」就儲存在字元常量區裡面;3)全域性區:在全域性區里儲存一些全域性變數和靜態變數;4)堆:堆主要是通過動態分配的儲存空間,也就是我們接下需要講的動態分配記憶體空間。

什麼時候我們需要動態分配記憶體空間呢?舉乙個例子吧。int *p; 我們定義了乙個指向int型別的指標p;p是用來儲存乙個位址的值的,我們之所以要為p

這個變數分配空間是讓它有乙個明確的指向,打個比方吧!你現在做好了乙個指向方向的路標,但是你並沒有讓這個路標指向乙個確切的方位,也就是說現在的這個路標是瞎指向的,這樣我們就不能夠通過它來明確到底**是東,**是西,何為北,何為南了。雖然我們在計算機的記憶體裡定義了乙個指標變數,但是我們並沒有讓這個變數指示乙個確切int型別變數的位址,所以我們就必須要讓它有乙個明確的指示方向。這樣我們就要通過動態分配記憶體的方式來認為的規定它的方向!

我們在剛剛接觸指標的時候遇到過這樣的情況,int *p;p=&a;這種方法不是指標的動態分配記憶體,這個叫做指標變數的初始化!初始化同樣也可以讓指標變數有方向可指。

int *p;p=malloc(n*sizeof(型別名稱));我們通過malloc()函式為乙個指標變數p分配了位址,這樣我們從鍵盤上鍵入的值就這樣儲存在p裡面了,接下來我們就可以對這個p進行具體的操作了,比如scanf(「%s」,p)等等。當我們對p結束操作的時候還要釋放p的記憶體空間。為什麼要釋放記憶體空間呢?在上面我已經講過動態分配的變數時儲存在堆裡面,但是這個堆的空間並不是無限大的,也許當我們編乙個小的程式的時候可能我們並不能夠發現什麼,但是對於那些大的程式,如果我們比及時釋放堆的空間的時候會放生記憶體洩露。所謂記憶體洩露是因為堆的空間北我們動態分配用完了,這樣當我們再去使用動態分配堆的空間的時候就沒有足夠的空間讓我們使用了,這樣就需要占有原來的空間,也就是會把其他的空間來儲存我們鍵入的值,這樣會導致原來儲存的資料被破壞掉,導致了記憶體的洩露了。

同時當我們使用malloc()函式的時候還應該注意當我們釋放完空間的時候還要將原先的指標變數賦予乙個null,也就是賦予乙個空指標,留著下次的時候使用它!如果我們不賦予|null行不行呢??答案是:不行的!如果我們不賦予乙個空指標這樣會導致原先的指標變數成為了乙個野指標!何謂野指標?野指標就是乙個沒有明確指向的指標,系統不知道它會指向什麼地方,野指標是很危險的,因此當我們每次使用完malloc()函式的時候都必須將指標賦予乙個空指標!相對於malloc()函式,calloc()函式就不需要我們賦予null了,這是因為在每次呼叫完calloc()函式的時候系統會自動將原先的指標賦予乙個空指標,即歸於「0」。calloc()函式的原型是void *calloc(count,sizeof(型別名稱));比如:p=(char*)calloc(4,sizeof(char));我們為p分配了指向char型指標的「4」個空間。

除了malloc()與calloc(),還有乙個動態分配空間的函式realloc()函式,這個函式比前兩個函式分配更多的空間,原型:void *realloc(void *p,size_t size);

該函式有幾個作用:

1) 如果有足夠的空間來擴充p的記憶體塊,則返回乙個指向p的指標;

2) 如果沒有足夠的空間來擴充p的記憶體塊,則為p從新分配size的空間,並把原來的內容複製給p,指向p的開頭,同時釋放原來的空間,返回乙個指向新記憶體塊的指標;

3) 如果p=null,其作用於malloc()相似;

下面舉乙個程式的例子:

#define long 10

#include

#include

#include

main()

{char *message,buf[long];

gets(buf);

message=(char*)realloc(null,strlen(buf)+1);

strcpy(message,buf);

puts(message);

gets(buf);

message=(char*)realloc(message,(strlen(message)+strlen(buf)+1));

strcat(message,buf);

puts(message);

return 0;

當你不確定記憶體空間大小的時候。。有2種辦法。

1。預先定義乙個足夠大的空間。(這個比較浪費資源。而且隨著程式的使用推廣。預先定義的空間也不一定能完全滿足條件)

2。動態的分配記憶體。可以做到準確分配空間大小。不浪費資源,而且也不會發生程式不斷使用預先分配記憶體不足。

備註:動態分配的記憶體空間系統不負責自動**,需要寫**手動釋放。

什麼時候需要給指標分配記憶體malloc

include intmain 注意 c語言中是不可以直接給指標賦值的,如 p 5.需要先申請一塊記憶體,才可以給指標賦值。但字串常量卻可以。include intmain 如上 hello 正常賦值給了指標p,也可以正常輸出字串,但輸出時,填的是p而不是 p,因為字串常量 hello 出現在乙個表...

記憶體動態分配

陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...

動態分配記憶體

動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...