簡體   English   中英

如何在c中的函數中釋放分配的數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM