在C語言中,動態內存分配和釋放是通過幾個標準庫函數來實現的
void *malloc(size_t size)
:此函數用于分配所需的內存空間,其參數size
表示要分配的字節數。如果分配成功,則返回指向分配內存的指針,否則返回NULL。#include<stdio.h>
#include <stdlib.h>
int main() {
int n = 10;
int *arr;
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("內存分配失敗!\n");
exit(0);
}
// 使用分配到的內存
for (int i = 0; i < n; i++) {
arr[i] = i;
}
free(arr); // 釋放內存
return 0;
}
void *calloc(size_t num, size_t size)
:此函數用于分配所需的內存空間,并將這些內存初始化為零。其參數num
表示要分配的塊數,size
表示每塊的大小。如果分配成功,則返回指向分配內存的指針,否則返回NULL。#include<stdio.h>
#include <stdlib.h>
int main() {
int n = 10;
int *arr;
arr = (int *)calloc(n, sizeof(int));
if (arr == NULL) {
printf("內存分配失敗!\n");
exit(0);
}
// 使用分配到的內存
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]); // 輸出0,因為已經初始化為0
}
free(arr); // 釋放內存
return 0;
}
void *realloc(void *ptr, size_t size)
:此函數用于調整之前分配的內存大小。其參數ptr
表示指向原先內存區域的指針,size
表示新的內存大小。如果分配成功,則返回指向新內存區域的指針,否則返回NULL。#include<stdio.h>
#include <stdlib.h>
int main() {
int n = 10;
int *arr;
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("內存分配失敗!\n");
exit(0);
}
// 使用分配到的內存
for (int i = 0; i < n; i++) {
arr[i] = i;
}
// 調整內存大小
int new_n = 20;
arr = (int *)realloc(arr, new_n * sizeof(int));
if (arr == NULL) {
printf("內存調整失敗!\n");
exit(0);
}
// 繼續使用分配到的內存
for (int i = n; i < new_n; i++) {
arr[i] = i;
}
free(arr); // 釋放內存
return 0;
}
void free(void *ptr)
:此函數用于釋放之前分配的內存。其參數ptr
表示指向要釋放的內存區域的指針。注意,在釋放內存后,不要再使用該內存區域,否則可能會導致未定義行為。請注意,在使用這些內存管理庫函數時,務必檢查返回值以確保內存分配或調整成功,并在不再需要內存時釋放它們。這有助于避免內存泄漏和其他內存相關問題。