c-在分配内存的void函数外释放内存



我有一个空函数

void foo(int *ptr) {
   //trying to allocate memory to hold 5 ints
   ptr = malloc(sizeof(int)*5):
   //I loop ptr and assign each with a value i =0 to 4;
}

在主要功能我有这行

int main() {
    int *num;
    //I called the function 
    foo(&(num));
    free(num);
   return 1;
}

我得到munmap_chunk()无效指针错误。我确实试着挖掘更多的信息,但我想不通。我知道这对那些在c工作的人来说是基本的。我想我是通过参考,它应该有效,但事实并非如此。我是C的新手,到目前为止一直很头疼。

ptr是一个局部变量,他的生命周期以函数结束,您需要一个指向指针的指针来更改main 中的num

   void foo(int **ptr) {
       //trying to allocate memory to hold 5 ints
       *ptr = malloc(sizeof(int)*5);
       //I look ptr and assign each with a value i =0 to 5;
   }

对于初学者来说,函数foo的声明类似

void foo(int *ptr);
         ^^^^^^^^

即其参数具有类型CCD_ 4。当你调用类似的函数时

foo(&(num));
    ^^^^^^

其中其自变量的类型为int **,因为变量num的声明类似

int *num;

编译器至少应该发出类型不兼容的消息。

您需要以以下方式定义的功能

void foo(int **ptr) {
         ^^^^^^^^^
   //trying to allocate memory to hold 5 ints
   *ptr = malloc(sizeof(int)*5):
   ^^^^
   //I loop ptr and assign each with a value i =0 to 4;
}

在这种情况下,函数调用将是正确的,并且由于原始指针是通过引用传递的,因此它将在调用函数后更改。

至于最初的功能定义

void foo(int *ptr) {
   //trying to allocate memory to hold 5 ints
   ptr = malloc(sizeof(int)*5):
   //I loop ptr and assign each with a value i =0 to 4;
}

则它的参数是函数的局部变量,该函数保存参数的副本。作为原始参数副本的局部变量的任何更改都不会影响原始指针本身。退出函数后,局部变量(参数)ptr将被销毁。

相关内容

  • 没有找到相关文章

最新更新