C 将内存释放到其分配区域之外

C 将内存释放到其分配区域之外,c,pointers,free,C,Pointers,Free,晚上好 在C编程语言中,我正在处理指针,我不断地得到(内核转储)错误。很明显,我的一些代码被弄乱了。下面是我正在做的一些示例代码(但不是我的实际代码)。请注意,我正在其中一个函数中返回一个本地指针 struct foo* new_foo ( ) { struct foo myfoo; return &myfoo; } void free_foo ( struct foo* myfoo ) { // pnt_var is being used on anothe

晚上好


在C编程语言中,我正在处理指针,我不断地得到(内核转储)错误。很明显,我的一些代码被弄乱了。下面是我正在做的一些示例代码(但不是我的实际代码)。请注意,我正在其中一个函数中返回一个本地指针

struct foo* new_foo ( )
{
    struct foo myfoo;
    return &myfoo;
}

void free_foo ( struct foo* myfoo )
{
     // pnt_var is being used on another part
     // of the program so we can't free it yet
    foo->ptr_var = NULL;
    free(foo);
}

所以我的问题是,我如何通过一个函数正确地释放一段内存,而不释放该结构分配的内存(在程序的其他部分仍然是活动的)。如果有帮助的话,我正在实现列表。

myfoo
是一个堆栈分配的
struct
。您可能需要动态地
malloc()
结构,然后在
new\u foo

像这样:

struct foo *new_foo(){ return malloc(sizeof(struct foo));}

free()不要那样做。也不要对堆栈上分配的内容调用free(),即使在它的生命周期内也是如此。@Raiyan不,我没有。如果free()已经是一个空值,它不是什么都不做吗?我不确定,这就是为什么我asked@user2958652NULL定义为
(void*)0
,它也是一个有效地址,不能在用户代码中访问。这就是为什么我创建结构“对象”的唯一方法应该是malloc&friends?如果你想让它们在功能范围之外可用,那么是的。我相信还有另一个答案有很好的信息,但我想有人删除了它。它提到,一旦函数调用完成,本地定义的变量将自动释放,因此指向其地址的任何指针都指向随机内存。无论如何,我想选择这个答案作为最好的答案,但不知道怎么做。你的答案隐含的小细节。谢谢你的快速回答。答案下面必须有一个绿色的复选标记。。这就是你选择它的方式。