C語言 動態內存分配詳解
動態內存分配涉及到堆棧的概念:堆棧是兩種數據結構。堆棧都是數據項按序排列的數據結構,只能在一端(稱為棧頂(top))對數據項進行插入和刪除。
棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似于鏈表。
/在C語言中,全局變量分配在內存中的靜態存儲區,非靜態的局部變量(包括形參)是分配在內存的動態存儲區,該存儲區被稱為棧。除此之外,c語言還允許建立內存動態分配區域,以存放一些臨時用的數據,這些數據不必在程序的聲明部分定義,也不必等到函數結束時才釋放,而是需要時隨時開辟,不需要是隨時釋放。這些詩句臨時存在一個特別的自由存儲區,稱為堆區。
系統提供了四個庫函數來實現內存的動態分配:
(1)malloc(size) 在內存的動態存儲區中分配一個長度為size的連續空間。
(2)calloc(n,size) 在內存的動態存儲區中分配n個長度為size的連續空間。
(3)free(p) 釋放指針變量p做指向的動態空間。
(4)realloc(p,size) 將指針變量p指向的動態空間大小改變為size。
舉個栗子:
#include<stdio.h>#include<stdlib.h>int main(){ void check(int *); int *p1, i; p1 = (int *)malloc(5*sizeof(int)); for ( i = 0; i < 5; i++) scanf("%d",p1+i); check(p1); getchar(); getchar(); return 0;}void check(int *p){ int i; for (i = 0; i < 5; i++) if (p[i] < 60) printf("%d", p[i]); printf("/n");}
程序沒有定義數組,而是開辟了一段動態自由分配區,輸入數字時,按照地址復制給動態數組的5個元素,p1指向第一個整型數據,調用check函數時,p1作為實參傳遞給形參p,因此可以理解為形參p和實參p1公享一段動態分配區。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
圖片精選