一、malloc函數的介紹和用法
malloc函數是C語言中的一種動態內存分配函數,它的聲明在stdlib.h中,函數原型如下:
void* malloc(size_t size);
其中size為申請內存的大小,返回值是指向void類型的指針,指向申請的內存起始地址。
使用malloc函數申請內存可以用於需要動態分配內存的程序,比如鏈表、數組等等。
二、malloc函數的基本使用
下面是一個簡單的基於C語言的malloc函數使用示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int num, i;
printf("請輸入要申請的整數個數:");
scanf("%d", &num);
ptr = (int*) malloc(num * sizeof(int)); // 用malloc申請一段內存空間,大小為num個整數
if (ptr == NULL) // 如果申請失敗,輸出提示信息
{
printf("Memory allocation failed.\n");
exit(1);
}
printf("請輸入%d個整數:\n", num);
for (i = 0; i < num; i++) // 輸入num個整數
{
scanf("%d", ptr + i);
}
printf("你輸入的%d個整數是:\n", num);
for (i = 0; i < num; i++) // 輸出num個整數
{
printf("%d ", *(ptr + i));
}
free(ptr); // 釋放內存空間
return 0;
}
該實例中為了在內存中存儲num個整數,使用了malloc函數,成功申請內存後,將返回一個指向int類型的指針,在使用過程中需要注意:
- 及時釋放內存空間,避免內存泄漏
- 必要時判斷申請內存的指針是否為空,以避免程序崩潰
三、calloc函數和realloc函數
malloc是C語言中常用的內存分配函數,但實際上C語言還有其他兩個常用的動態內存分配函數:calloc函數和realloc函數。
與malloc函數不同,calloc函數在分配內存時回把分配的內存空間清零。下面是一個基於C語言的calloc函數使用示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int num, i;
printf("請輸入要申請的整數個數:");
scanf("%d", &num);
ptr = (int*) calloc(num, sizeof(int)); // 用calloc申請一段內存空間,大小為num個整數
if (ptr == NULL) // 如果申請失敗,輸出提示信息
{
printf("Memory allocation failed.\n");
exit(1);
}
printf("請輸入%d個整數:\n", num);
for (i = 0; i < num; i++) // 輸入num個整數
{
scanf("%d", ptr + i);
}
printf("你輸入的%d個整數是:\n", num);
for (i = 0; i < num; i++) // 輸出num個整數
{
printf("%d ", *(ptr + i));
}
free(ptr); // 釋放內存空間
return 0;
}
calloc與malloc實際上用法是類似的,不過可以看到,calloc的第一個參數n表示要申請的內存塊數,而不是malloc的樣板參數。第二個參數size是內存塊的大小,返回值是一個指向void類型的指針。
realloc函數的作用是重新分配內存空間,即在原內存空間擴展或收縮一定的空間,下面是一個基於C語言的realloc函數使用示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int num, i;
printf("請輸入要申請的整數個數:");
scanf("%d", &num);
ptr = (int*) malloc(num * sizeof(int)); // 用malloc申請一段內存空間,大小為num個整數
if (ptr == NULL) // 如果申請失敗,輸出提示信息
{
printf("Memory allocation failed.\n");
exit(1);
}
printf("請輸入%d個整數:\n", num);
for (i = 0; i < num; i++) // 輸入num個整數
{
scanf("%d", ptr + i);
}
printf("你輸入的%d個整數是:\n", num);
for (i = 0; i < num; i++) // 輸出num個整數
{
printf("%d ", *(ptr + i));
}
printf("\n請輸入新的整數個數:");
scanf("%d", &num);
ptr = (int*) realloc(ptr, num * sizeof(int)); // 重新申請內存空間
if (ptr == NULL) // 如果申請失敗,輸出提示信息
{
printf("Memory allocation failed.\n");
exit(1);
}
printf("請輸入%d個整數:\n", num);
for (i = 0; i < num; i++) // 輸入num個整數
{
scanf("%d", ptr + i);
}
printf("你輸入的%d個整數是:\n", num);
for (i = 0; i < num; i++) // 輸出num個整數
{
printf("%d ", *(ptr + i));
}
free(ptr); // 釋放內存空間
return 0;
}
可以看到,在使用realloc函數時,需要傳入原內存空間的指針和新的內存空間大小(即分配的字節數),如果操作成功,那麼該函數會返回新的指針值,指向從原始內存中複製過來的數據,原始內存將被釋放,以避免內存泄漏。
四、動態內存分配的優缺點
使用動態內存分配功能的優點:
- 可以更加靈活地管理內存,在程序的運行過程中只有需要內存時才會得到申請,在不需要時及時釋放。
- 可以節省程序的內存空間,增強程序的可讀性和可維護性。
使用動態內存分配功能的缺點:
- 相較於靜態內存分配,需要更多的計算機處理時間。
- 應用程序必須負責釋放所使用的動態內存,否則會導致內存泄漏。
- 動態內存分配過多會導致內存碎片問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159183.html