2010-02-21 99 views
4

我得到一个分段错误free荷兰国际集团一定指针后:free()之后的分段错误,这是什么原因?

free(studentDB->name); 

我可以没有任何错误或警告得到其数值:

printf("[DBG] studentDB->name: %s\n", studentDB->name); 

然而,正如我所说的,程序崩溃时我尝试释放它。导致分段错误的free命令的最常见原因是什么?

回答

13

如果你没有malloc()它,你不能free()它。 studentDB->name从哪里来?

+0

或者您尝试释放它两次。我认为更常见。 – 2010-02-21 21:39:17

+1

现货。这是一个指针,但我没有使用'malloc'来为它分配内存。 – Pieter 2010-02-21 21:39:57

2

你可能已经或者免费()“主编它已经,或致电它放在未分配的指针改写超限

0

free段错误可导致缓冲区块前面的malloc的信息与malloc,或已经free已经。

如果您发布studentDB->name分配的代码,这将有所帮助。

2

通常在程序的其他地方发生堆损坏。堆通常是连续的,并且堆管理器围绕带有标题的堆块来跟踪块 - 如果覆盖该块的标题,访问该标题很好,但free很可能会失败。

0

以前有studentDB->name吗?如果您没有为该字段分配内存,那么很可能是您拨打free时,最终会出现seg-fault错误!请检查该字段,确保它是malloc d或strdup d。

或者是有腐败在堆上别处,与此正好为你正确地指出,你所看到的name值...

希望这有助于 最好的问候, 汤姆。

0

如果studentDB为NULL,也可能是访问studentDB指针的名称成员是segfault。

0

从手册页:

免费(PTR)释放内存空间 ptr所指向的,这一定是 已返回由以前调用 的malloc(),释放calloc()或realloc() 。 否则,或者如果免费(ptr)已经在之前调用过 ,则会发生未定义的 行为。如果ptr为NULL,则不执行 操作。

你也可以检查:

  1. 是studentDB非NULL指针包含成员“名称”一类/结构?
  2. studentDB-> name指向的空间是否由malloc/calloc/realloc返回?