c free()在我调用但不在我的函数中时起作用

时间:2015-05-14 15:33:24

标签: c memory malloc free

我正在学习C,我正在玩malloc并且免费。但由于某种原因,当我在main中使用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;

它有效

2 个答案:

答案 0 :(得分:2)

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

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

应该可以正常工作。

编辑:按del(&s);

调用该函数

答案 1 :(得分:0)

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

然后你最终做了所谓的“free after(free)”,这在某些情况下(可能)并不是主动有害,但在一般情况下可能是一个崩溃错误(可能是代码注入和攻击)。

重写del以获取指针指针并传递&s,或让del返回“新值”并执行s = del(s)。< / p>