C语言 外部函数中的 malloc() 会导致内存泄漏



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

我想要的是为 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);
}

我似乎不明白为什么这不起作用。在我的脑海中numbers[n]我传递给malloc_number是一个指向某个未分配数字的指针。然后我使用 number = malloc(sizeof(int));(数字 = 数字 [n]) 为该指针分配内存。

我做错了什么?

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

此函数泄漏内存。请记住,C 是按值传递的,number参数是一个具有自动存储持续时间的对象,当malloc_number返回时被销毁。如果要通过函数修改指针,则必须将指针传递给指针。

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

此代码是错误的。您正在设置 var "number" 的值,该值是一个参数,在函数调用后会丢失。正确的代码是:

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

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

相关内容

  • 没有找到相关文章

最新更新