【问题标题】:c free() works when I call but not in my functionc free() 在我调用时有效,但在我的函数中无效
【发布时间】:2015-07-26 07:19:36
【问题描述】:

我正在学习 C,我正在玩 malloc 和 free。但是由于某种原因,当我主要使用 free() 时,一切正常,但是当我将它放入我的函数中时,它却没有

  #include <stdlib.h>
  #include <stdio.h>

  struct st {
    int number;
  };
  void del(struct st *s) {
    if (s == NULL) return;
    free(s); s = NULL;
  }
  int main() {
    struct st *s;
    s = (struct st *)malloc(sizeof(struct st));
    s->number = 4;
    printf("The value is: %d", s->number);
    del(s);
  //  free(s); s= NULL;
    if(s == NULL) printf("\nThe struct is removed from memory\n");
    else printf("\nThe value is: %d\n", s->number);
    return 0;
  }

这个回声:

The value is: 4
The value is: 0

但如果我这样做:

   // del(s);
    free(s); s= NULL;

有效

【问题讨论】:

  • 为什么这是重复的?
  • 这并不是那个问题的真正重复。这里的主要问题是参数是通过副本传递的,因此del() 中的s = NULL; 只会更改本地副本(更改不会传播回main())。 free() 正在工作。
  • 所以,您可以在main() 中调用del(s),然后在main() 中写入s = NULL;
  • @FilipeGonçalves 我怎样才能使用我的函数来释放和 NULL 它呢?
  • 将指针传递给指针:void del(struct st **s) { free(*s); *s = NULL; },然后像这样在main() 中调用它:del(&amp;s);

标签: c memory malloc free


【解决方案1】:

您将指针传递给您的函数,这意味着它只能访问此指针的本地副本。所以你的free(s) 只会释放这个本地副本。如果您想释放一个变量,即在您调用free 的函数范围之外,您需要通过再次取消引用(传递指向此指针的指针)来访问它。

void del(struct st **s) {
    if (*s == NULL) return;
    free(*s); 
    *s = NULL;
}

应该可以正常工作。

编辑:通过del(&amp;s)调用函数;

【讨论】:

    【解决方案2】:

    您的 del 函数释放分配的内存并将 NULL 分配给变量的本地副本。但是,本地副本与调用站点的副本不同(即使两者都指向同一个已分配对象,但已被释放)。

    然后您最终会执行所谓的“在 free() 之后使用”,这在这种特定情况下(可能)不会造成严重危害,但在一般情况下可能是一个崩溃错误(并且可能是代码注入和漏洞利用)。

    要么重写del 以获取指向指针的指针并将&amp;s 传入,要么让del 返回“新值”并执行s = del(s)

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多