int 数组的内存分配,在方法中设置

Posted

技术标签:

【中文标题】int 数组的内存分配,在方法中设置【英文标题】:Memory allocation for int array, set in method 【发布时间】:2015-07-29 10:18:56 【问题描述】:

我是 C 的新手,我有一个关于理解一个内存分配问题的问题:

假设我为一个 int 数组分配内存:

 int* my_array = malloc(sizeof(int)*10);

现在我知道给定大小的内存块已分配在位置 '&my_array[0]'(或只是 my_array)。

所以:

如果我知道调用一个方法来填充我的数组,我知道我应该将指向我的数组的指针作为参数提供以填充它,所以类似于:

void fill_array(int* array) //..do something
fill_array(my_array);

但我想知道,如果方法本身分配另一个内存块,然后我尝试将它们设置为相等,会发生什么,所以我的意思是:

int* get_filled_array() 

    int* result_array = malloc(sizeof(int)*10);
    //fill it somehow...

  return result_array;

然后我将其设置为:

 int* my_array = malloc(sizeof(int)*10);
 my_array = get_filled_array();

my_array 的内存是否被删除或发生了什么?我怀疑这种方式是错误的,但只是想知道。 我想如果我想这样做,我应该创建一个临时数组,获取 (get_filled_array() 的返回数组,然后设置 my_array 和临时相等,这样我以后可以释放两者的内存吗?

【问题讨论】:

【参考方案1】:

如果你这样做

my_array = malloc(...);
my_array = ...;

my_array 的旧值(malloc 分配的块的地址)被覆盖并丢失。这称为"memory leak"(它不能是freed,因为程序不再知道它在哪里)。

如果你想这样做,只需使用

int *my_array = get_filled_array();

无需拨打malloc 两次。

【讨论】:

【参考方案2】:

由于语句中分配的内存地址会出现内存泄漏

int* my_array = malloc(sizeof(int)*10);

此任务完成后将丢失

my_array = get_filled_array();

而且之前分配的内存无法释放。

因此在调用get_filled_array之前,你必须释放已经分配的内存

int* my_array = malloc(sizeof(int)*10);
//...
free( my_array );
my_array = get_filled_array();

【讨论】:

【参考方案3】:

渲染给free(.) 渲染给你的所有malloc(.)

也就是说,您必须致电 free(.) 处理您从 malloc(.) 获得的任何信息。

您的代码无法free(.) 第一个malloc(.) 返回的指针

这样的代码:

 int * my_array = get_filled_array();

 //All code using `my_arrray` must in or called from this section...


 free(my_array);

考虑调用函数malloc_filled_array(.),这样它在分配内存中的作用就很明显了。

如果您只是零填充,您可能更喜欢使用 calloc(.),它会为您完成,如果这很重要,在许多平台上会更有效。

注意:您还需要对 calloc(.)realloc(.) 返回的值调用 free(.)

最后,有时只让程序结束而不调用free(.) 是可以接受的,并且您确信运行时/操作系统将在终止期间恢复任何分配的内存。如果你在一个有循环的程序中这样做,它可能会继续分配更多的内存并用完,即使它并没有真正使用它分配的所有内容。

除非绝对必要,否则不推荐使用此策略,因为它往往会掩盖程序的泄漏问题。

【讨论】:

以上是关于int 数组的内存分配,在方法中设置的主要内容,如果未能解决你的问题,请参考以下文章

Android studio3.2 分配内存设置方法

Android studio3.2 分配内存设置方法

Android studio3.2 分配内存设置方法

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

int数组中的内存是如何分配的

java中创建数组时怎么分配内存?