【问题标题】:free memory outside a void function where it is allocated在分配它的 void 函数之外释放内存
【发布时间】:2016-08-01 15:42:28
【问题描述】:

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

【问题讨论】:

  • 您传递给foo() (int**) 的内容与foo() (int*) 期望的参数类型不匹配。没有从您的编译器收到任何警告消息?您可能打算使用void foo(int **ptr) { *ptr = malloc(...); ...}
  • @P.P 如果你看主函数我传递了一个指针,一个指向 int 的地址
  • @user1986244 实际上,您传递了一个指针的地址。指向指针的指针。 foo() 应该收到 int **

标签: c pointers malloc


【解决方案1】:

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

【讨论】:

  • 这不是私人消息,但我很乐意与您联系。当我参加 C 课程时,我真的需要更多的见解。如果你愿意,我很乐意留下我的电子邮件
  • @user1986244 - 我认为您的意思是 AlterMann,而不是我;他更有用一点 :^) 在 SO 上,您可以通过 chat rooms 与其他用户聊天。不幸的是,您确实需要 100 个代表才能开始与某人聊天,但您很快就会到达那里。
  • but what I am passing is *num, just a pointer, 不,num 是一个指针,但是使用带有指针的&(地址)会产生一个指向指针的指针。
  • @Alter 对不起,我一直弄乱你的名字,感谢您的解释。我想给某人发电子邮件并简单地询问,而不仅仅是在这里发帖。了解指针如何工作的基础知识很好,我仍在努力掌握。
  • @user1986244,要了解指针的基本知识,C FAQ 是一个好的开始:c-faq.com/ptrs/index.html
【解决方案2】:

对于初学者来说,函数 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将被销毁。

【讨论】:

  • 我想你回答了我刚刚问过 Alter 的一个问题。谢谢你。我想知道我只传递了带有 *num 的指针,但添加 & 使其成为 **num,而我的函数定义没有反映这一点。
  • @user1986244 如果要更改main中声明的原始指针,则该函数的调用是正确的。那就是变量应该通过引用传递。但是函数定义不正确,因为函数不接受引用指针。所以它只改变它的局部变量(指针),即它的参数。:)
  • @thank you, 如果允许,我可以给你发电子邮件。真是三四小时零几天这样的问题。
  • @user1986244 有时即使是非常合格的程序员也无法在几个小时内发现明显的错误。:)
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多