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"(它不能是free
d,因为程序不再知道它在哪里)。
如果你想这样做,只需使用
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 数组的内存分配,在方法中设置的主要内容,如果未能解决你的问题,请参考以下文章