我是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和临时相等,这样我以后可以释放两者的内存吗?
答案 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] ...
的情况下结束,并且您确信运行时/操作系统将在终止期间恢复任何已分配的内存。如果你在一个有循环的程序中这样做,它可能会继续分配更多的内存并耗尽,即使它并没有真正使用它分配的所有东西。
除非绝对必要,否则这不是推荐的策略,因为它会掩盖程序的泄漏问题。