[英]how to free an allocated array in a function in c
如果我們使用malloc()
在main()
,我們可以free()
在動態內存分配main()
但是,如果我們在不同的函數中使用malloc()
並且在main()
使用該函數,那么我們應該在哪里調用free()
來釋放在該函數中分配的內存?
即,在以下源代碼中:
#include <stdio.h>
#include <stdlib.h>
int * memory_allocate_function(int);
int main(void) {
int n=5; //length of array, 5 for example.
int *my_array;
my_array = memory_allocate_function(n);
return 0;
}
int * memory_allocate_function(int n) {
int i;
int *array;
array=(int *)malloc(n * sizeof(int));
if(array == NULL) {
printf("can not allocate memory.");
return NULL;
}
// I think i can't use "free(array);" in here.
// Because I need that array in main().
return array;
}
這是最好的方法嗎?
當不再需要內存時,應該釋放內存。
由於在memory_allocate_function
退出后數組將不再可訪問(因為array
未返回或以其他方式可供外部訪問),因此應在memory_allocate_function
退出之前釋放它。
void memory_allocate_function(int n){
int i;
int *array;
array = malloc(n*sizeof(int));
if (array == NULL) {
fprintf(stderr, "Out of memory.");
exit(1);
}
// ... use the array ...
free(array);
}
在你完成它之后 - free
動態分配的內存。 但是設計明智-您也可以在其他功能中調用free
來正確管理它。 這真的取決於。 對此沒有硬性規定。
例如在這里你應該將該指針返回到分配的內存,然后在main
使用它之后你可以在main()
釋放它。
所以結構將類似於
int* memory_allocate_function(int n)
{
int i;
int *array;
array = malloc(n*sizeof(int));
if(array == NULL)
{
printf("can not allocate memory.");
exit(0);
}
return array;
}
然后在main()
int main(void)
{
int n=5; //length of array, 5 for example.
int *arr = memory_allocate_function(n);
// work with arr
free(arr);
return 0;
}
但是是的,正確命名函數- 如果您要使用名稱memory_allocate_function
函數,則僅執行此操作 - 不應存在任何其他主要邏輯。 這有助於創建良好的可讀代碼。
請注意一件事 - 在這里,當您調用該函數然后退出該函數時,該函數是唯一包含它的地址的局部變量,它的存儲持續時間已結束,您將永遠無法訪問您分配的內存。 這是內存泄漏的一種情況。 如果您確定不會從函數返回指向內存的指針 - 然后使用它(在相同的函數中或不同的函數中)然后釋放它(在函數的范圍結束之前 - 注意不要提到你會在哪里釋放它,您可以在相同的功能和其他功能中也可以這樣做)。
我忍不住要提幾件事情:- 1) 不要強制轉換malloc
的返回值。 2) 檢查malloc
的返回值 - 如果它是NULL
你想單獨處理它。 3) main()
) 的推薦簽名是int main(void)
如果你需要malloc
存儲功能於一體,並free
在另一個,你必須以某種精心傳遞指針指向malloc
從點編內存malloc
到您想要的點free
它。
您有責任保留指針值並將其從一個函數傳遞到另一個函數,直到它到達free
點。 如果在此過程中丟失了該值,則會發生內存泄漏。 內存泄漏就是您現在所擁有的,因為您沒有在任何地方傳遞該本地array
指針。
沒有“一種真正的方法”可以做到這一點,因為這取決於您的具體意圖。 例如,您可以從memory_allocate_function
返回該指針,接收它main
並最終在那里free
它
int *memory_allocate_function(int);
int main()
{
int n = 5;
int *arr = memory_allocate_function(n);
...
free(arr);
return 0;
}
int *memory_allocate_function(int n)
{
int *array = malloc(n * sizeof *array);
...
return array;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.