我正在学习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;
它有效
答案 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>