在外部函数中调用Malloc()会导致内存泄漏

在外部函数中调用Malloc()会导致内存泄漏,c,pointers,memory-leaks,malloc,C,Pointers,Memory Leaks,Malloc,我知道这是一个常见的问题,但就我而言,答案并不是那么简单(或者至少我认为是这样) 我想要的是为10个整数分配内存(如下图所示) 方案: _____HEAP_____ | | **numbers -----> *number ---|--> int | *number ---|-->

我知道这是一个常见的问题,但就我而言,答案并不是那么简单(或者至少我认为是这样)

我想要的是为10个整数分配内存(如下图所示)

方案:

                               _____HEAP_____
                              |              |
**numbers ----->  *number  ---|-->  int      |
                  *number  ---|-->  int      |
                  *number  ---|-->  int      |
                   ..         |              |
                  *number  ---|-->  int      |
                              |______________|
int** numbers;

void malloc_number(int* number){
    number = malloc(sizeof(int));
}

int main(){

    numbers = malloc(10*sizeof(int*));
    int n;
    for (n=0; n < 10; n++){
        //numbers[n] = malloc(sizeof(int)); // THIS WORKS
        malloc_number(numbers[n]);          // THIS DOESN'T
        free(numbers[n]);
    }
    free(numbers);
}
代码:

                               _____HEAP_____
                              |              |
**numbers ----->  *number  ---|-->  int      |
                  *number  ---|-->  int      |
                  *number  ---|-->  int      |
                   ..         |              |
                  *number  ---|-->  int      |
                              |______________|
int** numbers;

void malloc_number(int* number){
    number = malloc(sizeof(int));
}

int main(){

    numbers = malloc(10*sizeof(int*));
    int n;
    for (n=0; n < 10; n++){
        //numbers[n] = malloc(sizeof(int)); // THIS WORKS
        malloc_number(numbers[n]);          // THIS DOESN'T
        free(numbers[n]);
    }
    free(numbers);
}
int**number;
无效malloc_编号(整数*编号){
数字=malloc(sizeof(int));
}
int main(){
数字=malloc(10*sizeof(int*);
int n;
对于(n=0;n<10;n++){
//numbers[n]=malloc(sizeof(int));//这很有效
malloc_number(number[n]);//这不是
自由(数字[n]);
}
免费(数字);
}
我似乎不明白为什么这不起作用。在我看来,传递给malloc_number的
numbers[n]
是指向某个未分配数字的指针。然后我使用
number=malloc(sizeof(int))(number=numbers[n])为该指针分配内存

我做错了什么

   void malloc_number(int* number){
    number = malloc(sizeof(int));
   }
此函数泄漏内存。请记住,C是传递值,
number
参数是一个具有自动存储持续时间的对象,当
malloc\u number
返回时,该对象被销毁。如果要通过函数修改指针,必须将指针传递给该指针

void malloc_number(int* number){
    number = malloc(sizeof(int));
}
此函数泄漏内存。请记住,C是传递值,
number
参数是一个具有自动存储持续时间的对象,当
malloc\u number
返回时,该对象被销毁。如果要通过函数修改指针,必须将指针传递给该指针

void malloc_number(int* number){
    number = malloc(sizeof(int));
}
这个代码是错误的。您正在设置变量“number”的值,它是一个参数,在函数调用后丢失。 正确的代码应该是:

void malloc_number(int** number){
    *number = malloc(sizeof(int));
}
...
malloc_number(&numbers[n]);
还请注意,循环增量的约定为“i”或“j”,n是为最大值或限制保留的

这个代码是错误的。您正在设置变量“number”的值,它是一个参数,在函数调用后丢失。 正确的代码应该是:

void malloc_number(int** number){
    *number = malloc(sizeof(int));
}
...
malloc_number(&numbers[n]);

还请注意,循环增量的约定是“i”或“j”,n是为最大值或限制保留的。

Try'*number=malloc(sizeof(int))'C是按值传递的……Try'*number=malloc(sizeof(int))'C是按值传递的……这是我没有得到的。如果
number
被销毁,又有什么关系呢?它只是把地址保存在某个地方,当地址被销毁时,该地址已经被定位。。伤了我的大脑。@Pithikos的
number=malloc(sizeof(int))
您没有修改作为参数传递给
malloc\u number
的指针对象,因为C是传递值。因此,您最终得到的类似于
(void)malloc(sizeof(int))这意味着分配了一些内存,但由于丢失了它的位置值,您没有办法释放它:这就是我们所说的内存泄漏。这就是我不明白的。如果
number
被销毁,又有什么关系呢?它只是把地址保存在某个地方,当地址被销毁时,该地址已经被定位。。伤了我的大脑。@Pithikos的
number=malloc(sizeof(int))
您没有修改作为参数传递给
malloc\u number
的指针对象,因为C是传递值。因此,您最终得到的类似于
(void)malloc(sizeof(int))这意味着分配了一些内存,但由于丢失了其位置的值,您没有办法释放它:这就是我们所说的内存泄漏。