c - 释放指针重新分配自身?

标签 c struct structure dynamic-allocation

当我动态分配一个结构,然后尝试释放它时,它似乎重新分配了它。

typedef struct OBJ_T
{
   int param1, param2;
} OBJ;

OJB* Construct(int par1, int par2)
{
   OBJ* x = malloc(sizeof(OBJ));
   x->param1 = par1;
   x->param2 = par2;
   return x;
}

void freeup(OBJ *x)
{
   printf("x pointer -> %d ", x);
   free(x);
   x=NULL;
   printf("\nx pointer -> %d\n", x);
}

int main()
{
   OBJ foo = *Construct(10, 20);
   freeup(&foo);
   freeup(&foo);
   return 0;
}

结果是:

x pointer -> 2752216
x pointer -> 0
x pointer -> 2752216
x pointer -> 0

因此,在释放并清空指针后,如果我再次检查它,它会恢复到原来的状态。那是问题吗?还是它是免费的,我再也不用担心了?

最佳答案

首先,这一行是在堆栈上分配foo,然后将动态分配的结构复制到这个地方:

OBJ foo = *Construct(10, 20);

当然,你不应该释放它。正确的情况是:

OBJ* foo = Construct(10, 20);
. . .
freeup(foo);

其次,如果要清除freeup中的指针,则将参数类型更改为pointer-to-pointer:

void freeup(OBJ** x)
{
   free(*x);
   *x=NULL;
}

...在这种情况下,您应该将 freeup 调用更改为 freeup(&foo);

最后,foo 似乎在您的代码中被重新分配,但它不能被释放或分配,它是一个堆栈变量。所以指向 foo 的指针在函数内部总是相同的。

关于c - 释放指针重新分配自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741154/

相关文章:

c - 什么时候在 c 中使用 typedef?

json - Golang jsonable 指向 slice 中不同结构的指针

C 程序不在 Windows 上执行。它在 Unix 上

紧凑访问嵌套结构中的变量

c++ - 根据 C 标准,fprintf、fputs...在 Windows 上的功能是否合法?

C指针查询

C - fread 似乎没有将数据读回内存

c++ - 如何在不检查每个元素的情况下立即检查结构的零值?

c - 我在 SPOJ、语言 C、编译器 gcc 4.3.2 中收到以下代码的运行时错误:代码为 :

java - 使用安卓 JNI