在本教程中,您將學(xué)習(xí)使用標(biāo)準(zhǔn)庫函數(shù):malloc(),calloc(),free()和realloc()在C語言程序中動(dòng)態(tài)分配內(nèi)存。
如您所知,數(shù)組是固定數(shù)量的值的集合。聲明數(shù)組的大小后,您將無法更改它。
有時(shí),您聲明的數(shù)組的大小可能不足。要解決此問題,可以在運(yùn)行時(shí)手動(dòng)分配內(nèi)存。這在C語言編程中稱為動(dòng)態(tài)內(nèi)存分配。
可以使用標(biāo)準(zhǔn)庫函數(shù)malloc(),calloc(),realloc()和free(),進(jìn)行動(dòng)態(tài)分配內(nèi)存。這些函數(shù)在<stdlib.h>頭文件中定義。
名稱“ malloc”表示內(nèi)存分配。
malloc()函數(shù)保留一個(gè)指定字節(jié)數(shù)的內(nèi)存塊。 并且,它返回一個(gè)void指針,可以將其轉(zhuǎn)換為任何形式的指針。
ptr = (castType*) malloc(size);
示例
ptr = (float*) malloc(100 * sizeof(float));
上面的語句分配了400字節(jié)的內(nèi)存。因?yàn)楦↑c(diǎn)數(shù)的大小是4字節(jié)。并且,指針ptr保存分配內(nèi)存中的第一個(gè)字節(jié)的地址。
如果無法分配內(nèi)存,則表達(dá)式將產(chǎn)生NULL指針。
名稱“ calloc”表示連續(xù)分配。
malloc()函數(shù)分配內(nèi)存,并保留未初始化的內(nèi)存。 而calloc()函數(shù)分配內(nèi)存并將所有位初始化為零。
ptr = (castType*)calloc(n, size);
示例:
ptr = (float*) calloc(25, sizeof(float));
上面的語句在內(nèi)存中為25個(gè)float類型的元素分配連續(xù)空間。
使用calloc()或malloc()動(dòng)態(tài)分配的內(nèi)存不會(huì)自己釋放。必須顯式地使用free()來釋放空間。
free(ptr);
該語句釋放由ptr指向的內(nèi)存中分配的空間。
//程序來計(jì)算用戶輸入的n個(gè)數(shù)字的總和 #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("輸入元素?cái)?shù)量: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // 如果無法分配內(nèi)存 if(ptr == NULL) { printf("錯(cuò)誤! 內(nèi)存未分配。"); exit(0); } printf("輸入元素: "); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Sum = %d", sum); //釋放內(nèi)存 free(ptr); return 0; }
在這里,我們?yōu)閚個(gè)int動(dòng)態(tài)分配了內(nèi)存。
//程序來計(jì)算用戶輸入的n個(gè)數(shù)字的總和 #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("輸入元素?cái)?shù)量: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) { printf("錯(cuò)誤! 內(nèi)存未分配。"); exit(0); } printf("輸入元素: "); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
如果動(dòng)態(tài)分配的內(nèi)存不足或超過所需,可以使用realloc()函數(shù)更改以前分配的內(nèi)存的大小。
ptr = realloc(ptr, x);
在這里,ptr被重新分配為新的大小x。
#include <stdio.h> #include <stdlib.h> int main() { int *ptr, i, n1, n2; printf("輸入大小: "); scanf("%d", &n1); ptr = (int*)malloc(n1 * sizeof(int)); printf("先前分配的內(nèi)存地址: "); for (i = 0; i < n1; ++i) printf("%u\n", ptr + i); printf("\n輸入新的大小: "); scanf("%d", &n2); //重新分配內(nèi)存 ptr = realloc(ptr, n2 * sizeof(int)); printf("新分配的內(nèi)存地址: "); for (i = 0; i < n2; ++i) printf("%u\n", ptr + i); free(ptr); return 0; }
運(yùn)行該程序時(shí),輸出為:
輸入大小: 3 先前分配的內(nèi)存地址: 7452312 7452316 7452320 輸入新的大小: 5 新分配的內(nèi)存地址: 7452312 7452316 7452320 7452324 7452328