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

时间:2015-07-29 10:18:57

标签: c arrays pointers

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

所以我想说我为一个int数组分配内存:

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

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

SO:

如果我知道调用一个方法来填充我的数组,我知道我应该作为参数给出我的数组的指针以填充它,所以像这样:

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和临时相等,这样我以后可以释放两者的内存吗?

3 个答案:

答案 0 :(得分:4)

如果你这样做

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

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

如果您想这样做,请使用

int *my_array = get_filled_array();

无需再拨打malloc两次。

答案 1 :(得分:3)

因为语句

中分配的内存地址会有内存泄漏
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();

答案 2 :(得分:0)

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(.),以便它在分配内存时的行为是显而易见的。

如果你只是零填充,你可能更愿意使用free(.)为你做这件事,如果重要的话,在许多平台上会更有效率。

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

最后,有时可以让程序在不调用// Original array $days = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'); // Keys for the array $keys = array(1,2,3,4,5,6,7); $days = array_combine($keys, $days); // Print the new array with keys print_r($days); // Access to array $days[1] ... 的情况下结束,并且您确信运行时/操作系统将在终止期间恢复任何已分配的内存。如果你在一个有循环的程序中这样做,它可能会继续分配更多的内存并耗尽,即使它并没有真正使用它分配的所有东西。

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