【发布时间】: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(&s);