如何在c中的函数中释放已分配的数组

时间:2018-01-15 03:22:53

标签: c function memory-management free dynamic-memory-allocation

如果我们在 int main(void)中使用 malloc(),我们可以 free()在同一个主流中进行动态内存分配功能

但是现在;

例如,我们将在另一个函数中使用 malloc()。 我们在 int main(void)函数中使用该函数。 最后,我应该在哪里 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. cause of i need that array in main().
    return array;
}

我希望我能告诉你这个问题......你认为最好的方法是什么?

3 个答案:

答案 0 :(得分:4)

当不再需要内存时,应释放内存。

由于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);
}

答案 1 :(得分:3)

使用完之后好了 - 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)

答案 2 :(得分:1)

如果你需要在一个函数中malloc内存而在另一个函数中需要free,你必须以某种方式小心地将指针从malloc传递给malloc内存。到你希望free的地步。

您有责任保留指针值并将其从一个函数移交给另一个函数,直到达到free为止。如果您在此过程中丢失了该值,则会发生内存泄漏。您现在拥有内存泄漏,因为您没有将该本地array指针传递到任何位置。

没有&#34;一种真正的方式&#34;这样做,因为它取决于你的具体意图。例如,您可以从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;
}
相关问题