在分配的空函数之外的空闲内存

时间:2016-08-01 15:42:29

标签: c pointers malloc

我有一个无效功能

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的新手,到目前为止一直很头疼。

2 个答案:

答案 0 :(得分:7)

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

   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;
   }

答案 1 :(得分:1)

对于初学者来说,函数foo被声明为

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

该参数的类型为int *。当你调用像

这样的函数时
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