1樓:匿名使用者
描述記憶體分配方式以及它們的區別?
1) 從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static 變數。
2) 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於處理器的指令集。
3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc 或new 申請任意多少的記憶體,程式設計師自己負責在何時用free 或delete 釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但問題也最多。
2樓:匿名使用者
不加new,malloc的時候就是靜態分配記憶體,申請是棧中的空間,不需要自己釋放
new或malloc申請的是堆中的空間,需要呼叫delete或free釋放
3樓:匿名使用者
所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。
例如我們定義一個float型陣列:float score[100];
但是,在使用陣列的時候,總有一個問題困擾著我們:陣列應該有多大?在很多的情況下,你並不能確定要使用多大的陣列,比如上例,你可能並不知道我們要定義的這個陣列到底有多大,那麼你就要把陣列定義得足夠大。
這樣,你的程式在執行時就申請了固定大小的你認為足夠大的記憶體空間。即使你知道你想利用的空間大小,但是如果因為某種特殊原因空間利用的大小有增加或者減少,你又必須重新去修改程式,擴大陣列的儲存範圍。這種分配固定大小的記憶體分配方法稱之為靜態記憶體分配。
但是這種記憶體分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數情況下會浪費大量的記憶體空間,在少數情況下,當你定義的陣列不夠大時,可能引起下標越界錯誤,甚至導致嚴重後果。
我們用動態記憶體分配就可以解決上面的問題. 所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。
從以上動、靜態記憶體分配比較可以知道動態記憶體分配相對於景泰記憶體分配的特點:
1、不需要預先分配儲存空間;
2、分配的空間可以根據程式的需要擴大或縮小。
要實現根據程式的需要動態分配儲存空間,就必須用到malloc函式.
malloc函式的原型為:void *malloc (unsigned int size) 其作用是在記憶體的動態儲存區中分配一個長度為size的連續空間。其引數是一個無符號整形數,返回值是一個指向所分配的連續儲存域的起始地址的指標。
還有一點必須注意的是,當函式未能成功分配儲存空間(如記憶體不足)就會返回一個null指標。所以在呼叫該函式時應該檢測返回值是否為null並執行相應的操作。
c語言中的動態記憶體分配的用法舉例
4樓:匿名使用者
1、malloc函式:其作用是在記憶體的動態儲存區中分配一個長度為size的連續空間。其引數是一個無符號整形數,返回值是一個指向所分配的連續儲存域的起始地址的指標。
2、free函式:由於記憶體區域總是有限的,不能不限制地分配下去,而且一個程式要儘量節省資源,所以當所分配的記憶體區域不用時,就要釋放它,以便其它的變數或者程式使用。這時我們就要用到free函式。
3、calloc函式:其作用是在記憶體的動態儲存區中分配n個長度為 size 的連續空間。函式返回一個指向分配區域的起始位置的指標;如果分配不成功,則返回null。
擴充套件資料:
函式運算子:
new指標變數=new 資料型別;
例如:int *p=new int
該語句的作用是會用new從記憶體中申請了一個int型變數(4個位元組),並將該變數的首地址賦給指標變數p。
new所建立的變數的初始值是任意的,也可在用new分配記憶體的同時進行初始化。使用形式為:
指標變數=new 資料型別(初始值)。
delete
堆記憶體可按照要求進行分配,程式對記憶體的需求量隨時會發生變化,有時程式在執行種可能會不再需要由new分配的記憶體空間,而且程式還未執行結束,這時就需要把先前佔用的記憶體空間釋放給堆記憶體,以後重新分配,供程式的其他部分使用。運算子delete用於釋放new分配的記憶體空間,刪除建立的物件,它的使用形式為:
delete 指標變數;
其中的指標變數中儲存著new分配的記憶體的首地址。
5樓:**的可樂
要實現根據程式的需要動態分配儲存空間,就必須用到以下幾個函式
1、malloc函式
malloc函式的原型為:
void *malloc (u igned int size)
其作用是在記憶體的動態儲存區中分配一個長度為size的連續空間。其引數是一個無符號整形數,返回值是一個指向所分配的連續儲存域的起始地址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間(如記憶體不足)就會返回一個null指標。
所以在呼叫該函式時應該檢測返回值是否為null並執行相應的操作。
下例是一個動態分配的程式:
#include
#include
main()
for (count=0;count〈10;count++) /*給陣列賦值*/
array[count]=count;
for(count=0;count〈10;count++) /*列印陣列元素*/
printf("%2d",array[count]);
}上例中動態分配了10個整型儲存區域,然後進行賦值並列印。例中if((array(int *) malloc(10*sizeof(int)))==null)語句可以分為以下幾步:
1)分配10個整型的連續儲存空間,並返回一個指向其起始地址的整型指標
2)把此整型指標地址賦給array
3)檢測返回值是否為null
2、free函式
由於記憶體區域總是有限的,不能不限制地分配下去,而且一個程式要儘量節省資源,所以當所分配的記憶體區域不用時,就要釋放它,以便其它的變數或者程式使用。這時我們就要用到free函式。
其函式原型是:
void free(void *p)
作用是釋放指標p所指向的記憶體區。
其引數p必須是先前呼叫malloc函式或calloc函式(另一個動態分配儲存區域的函式)時返回的指標。給free函式傳遞其它的值很可能造成宕機或其它災難性的後果。
注意:這裡重要的是指標的值,而不是用來申請動態記憶體的指標本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……free(p2) /*或者free(p2)*/
malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函式的引數。
malloc函式是對儲存區域進行分配的。
free函式是釋放已經不用的記憶體區域的。
所以由這兩個函式就可以實現對記憶體區域進行動態分配並進行簡單的管理了。
6樓:
例如malloc,zizeof,free等原型:extern void *malloc(unsigned int num_bytes);
用法:#include
功能:分配長度為num_bytes位元組的記憶體塊說明:如果分配成功則返回指向被分配記憶體的指標,否則返回空指標null。
當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
舉例:// malloc.c
#include
#include
main()
7樓:匿名使用者
#include
#include
#define str_len 4096
int main ()
c語言中什麼是動態分配記憶體?
8樓:琦炫郎冠
就是當你的程式中使用陣列或者是指標變數的時候,為了能夠合理地利用記憶體空間來進行程式執行,自動開闢記憶體在棧區,最後用完這些記憶體再將其**的方式。動態記憶體分配不像靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要來分配,分配大小就是程式要求大小。
一般在c語言中使用malloc和free方法
標頭檔案為malloc.h或者是stdlib.h,
9樓:倫夜古吉
c語言用函式malloc動態分配記憶體的,要用到指標,釋放記憶體是free指標
malloc
原型:extern
void
*malloc(unsigned
intnum_bytes);
用法:#include
或#include
功能:用於向記憶體申請空間,分配長度為num_bytes位元組的記憶體塊說明:如果分配成功則返回指向被分配記憶體的指標,否則返回空指標null。
當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
呼叫格式,
指標名=(指標所指物件的資料型別*)malloc(個數*sizeof(指標所指物件的資料型別)),其對應例子如下:
int*p
=(int
*)malloc(n*
sizeof(int)
);舉例:
//malloc.c
#include
#include
main()
如何動態分配記憶體?
10樓:釁初彤褚浦
是兩碼事,首先我給你一下概念:
描述記憶體分配方式以及它們的區別?
1)從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static
變數。2)
在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於處理器的指令集。
3)從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new
申請任意多少的記憶體,程式設計師自己負責在何時用free或delete
釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但問題也最多。
只要你搞清楚以上這個概念,估計你也就明白你所提這個問題的答案了。
怎麼檢視動態分配記憶體空間的大小(c語言)。
11樓:匿名使用者
1、這個空間是自己分配的,既然已經寫了p=(int *)malloc(10000)那就分配10000的大小,還需要顯示多少大小。對於一個指向一塊記憶體的指標如果用比如sizeof(p)顯示大小(int * p=new int[10]),也只是顯示4,代表首地址大小,不能顯示正塊記憶體的大小,而且根本沒有意義。
2、動態記憶體分配,可以自由的分配指定大小的記憶體空間。當程式執行時,程式設計師並不清楚某一資料需要的具體記憶體空間大小時,可以使用動態分配。
malloc函式原型
void *malloc(int nsize)
分配一個nsize大小的記憶體空間,如果分配成功則返回地址空間的首地址,如果分配失敗則返貨null
nsize一般使用 sizeof(型別a)*n 的計算方式獲取大小。意思為:為分配n個型別a所佔空間的大小。
獲取的指標地址需要強制轉換為指定型別
例如:int *p = (int*)malloc(sizeof(int)*100);
使用malloc動態分配的記憶體空間需要使用free函式手動釋放。
我的電視只有動態分配和靜態IP。這兩種有什麼區別嗎
路由器設定dhcp服務,電視機設定動態ip分配就可以。靜態就是手動設定本裝置內ip 掩碼 閘道器等。容動態ip分配需要dhcp服務,即裝置通過向dhcp伺服器 路由器 申請ip,dhcp伺服器根據地址池,動態分 配ip 包括掩碼 閘道器等 動態ip分配的裝置,加電開機就行,其他不管。用靜態地址,還需...
我要讓DHCP伺服器的動態IP地址分配到下面vlan,每個vlan獲得相應的IP地址怎麼做 下面是拓撲圖
dhcp伺服器直接在r1上面做就ok了。沒必要使用兩個裝置吧。首先在r1上建立三個dhcp地址池,規劃好分配的地址斷,預留出地址池閘道器地址。其次在交換機上建立三個不同vlan,並把相關pc新增到各自的vlan中。交換機與r1之間通道模式為trunk,允許所有vlan通過r1的f0埠下,建立三個二級...
函式要返回動態申請記憶體的地址該如何辦呢
既然你申請的空間還有用處,當然不能在fun裡面free了,肯定要在呼叫fun的函式裡,在這個空間使用完以後free 每次呼叫函式就申請10個字元的空間,當然佔用記憶體就增加了。既然你malloc了記憶體,就有相應的地方free,一個程式有多少次malloc,在他結束前就應該有多少次free。你既然要...