c語言允許建立內存動態分配區域,以存放一些臨時用的數據,這些數據不必在程序的聲明部分定義,也不必等到函數結束時才釋放,而是需要時隨時開辟,不需要時隨時釋放,這些數據存儲在堆區。可以根據需要,向系統申請所取空間的大小,因為沒有在聲明部分定義它們為變量或數組,所以不能通過變量名或數組的方式去引用這些數據,只能通過指針來引用。
對內存的動態分配是通過系統提供的庫函數來實現的,主要有malloc,calloc,free,realloc這四個函數。
接下來寫一下malloc函數如何實現為一維,二維,三維數組分配空間。
一;一維數組的申請與釋放:
例如為一個字符數組分配空間:
char *p = (char *)malloc(m*sizeof(char));
釋放空間:
free(p);
二:二維數組的申請與釋放:
1:使用二級指針:
char **p = (char *)malloc(m*sizeof(char *)); for(i=0;i<m;i++) { p[i]=(char *)malloc(n*sizeof(char *)); } //釋放空間: for(i-0;i<m;i++) { free(p[i]); } free(p);
2:使用數組指針的方式:
char (*p)[3] = (char(*)[3])malloc(sizeof((char)*m*n);
這種方式分配的內存只需要釋放一次:
free(p);
三:三維數組的申請與釋放:
char ***p=(char* **)malloc(m*sizeof(char**)); for(i=0;i<m:i++) p[i]=(char **)malloc(n*sizeof(char*)); for(i=0;i<m;i++) for(j=0;j<n;j++) p[i][j]=(char *)malloc(p*sizeof(char)); //釋放空間: for(i=0;i<m;i++) for(j=0;j<n;j++) free(p[i][j]); for(i=0;i<m:i++) free(p[i]); free(p);
注意:可以看出分配空間與釋放空間都是逐步進行的,但是釋放空間的順序與分配空間的順序相反。