### 動態分配內存
可以在程序運行的時候,臨時決定需要分配多少個存儲區,這種分配存儲區的方法叫做動態分配。
為了管理動態分配的內存需要使用一組標準函數。
為了使用這些標準函數需要包含stdlib.h頭文件。
**malloc**
這個函數可以動態的分配一組連續的字節。
這個函數需要一個整數類型的參數表示希望分配的字節個數。
它的返回值代表分配好的第一個字節的地址。
如果分配失敗,則返回值是NULL。
返回值記錄在一個無類型的指針存儲區里,使用之前需要先進行轉換。
動態分配內存使用完以后需要使用專門的函數調用語句把它還給計算機,也就是釋放掉不用的內存,這就叫做釋放動態內存。
#include <stdio.h>
#include <stdlib.h>
int main(){
int *p_num = (int *)malloc(5 * sizeof(int));
return 0;
}
**calloc**
calloc函數也可以動態的分配一組連續的同類型存儲區。
這個函數可以把所有動態分配的存儲區內存設置成0。
這個函數也需要包含stdlib.h的頭文件。
這個函數需要兩個參數,第一個參數表示要分配的存儲區個數,第二個參數表示單個存儲區的大小。
calloc(5, sizeof(int))
這個函數的返回值也是分配好的第一個存儲區的地址。
這個函數也有可能失敗,如果失敗則返回值是NULL。
**realloc**
realloc函數可以調整一段動態分配內存中存儲區的個數。
這個函數工作比較復雜,耗時比較長,因此盡量少使用這個函數。
**free**
free函數可以用來釋放動態內存。
這個函數需要第一個字節的地址作為參數。
一起分配的所有內存必須一起釋放。
如果使用指針作為參數調用free函數,則函數結束后指針將成為野指針,必須恢復成空指針。
動態分配內存實例,包括分配內存,釋放內存和使用分配的內存:
動態分配的內存使用方式和數組是一樣的。
#include <stdio.h>
#include <stdlib.h>
int main(){
int num = 0;
int *p_num = (int *)malloc(5 * sizeof(int));
if (p_num){
for (num = 0;num <= 4;num++){
*(p_num + num) = num;
}
for (num = 0;num <= 4;num++){
printf("%d ", *(p_num + num));
}
printf("\n");
free(p_num);
p_num = NULL;
}
return 0;
}
調用函數可以使用被調用函數動態分配的存儲區。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int *create (int size){
int num = 0;
int *p_num = NULL;
p_num = (int *)malloc(size * sizeof(int));
if (!p_num){
return NULL;
}
srand(time(0));
for (num = 0;num <= size - 1;num++){
*(p_num + num) = rand() % 36 + 1;
}
return p_num;
}
int main(){
int size = 0, num = 0;
int *p_num = NULL;
printf("請輸入彩票的個數: ");
scanf("%d", &size);
p_num = create(size);
if (!p_num){
return 0;
}
for (num = 0;num <= size - 1;num++){
printf("%d ", *(p_num + num));
}
printf("\n");
free(p_num);
p_num = NULL;
return 0;
}
動態分配內存能不用則不要使用,因為在以后的開發過程中,很有可能會因為沒有釋放掉動態分配的內存從而導致內存溢出。