free()之后的分段错误,这有什么常见的原因?

时间:2010-02-21 21:36:26

标签: c free segmentation-fault

free某个指针之后我得到了一个分段错误:

free(studentDB->name);

我可以在没有任何错误或警告的情况下获得其价值:

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

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

7 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:2)

你可能已经免费()编辑它,或者用缓冲区溢出覆盖了块之前的malloc信息

答案 2 :(得分:2)

通常在程序中的其他位置堆损坏。堆通常是连续的,堆管理器围绕带有标头的堆块来跟踪块 - 如果你覆盖块的标题,访问它很好,但free最有可能失败。

答案 3 :(得分:0)

来自free的段错误可能是通过在未使用malloc分配的指针上调用它,或者已经free已经导致的。{/ p>

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

答案 4 :(得分:0)

之前是否已分配studentDB->name?如果你没有为该字段分配内存,很可能在你调用free时,你最终会出现seg-fault!请检查该字段,确保其为malloc d或strdup d。

或者说堆上的其他地方存在腐败,正如你正确指出的那样,你可以看到name的价值...

希望这有帮助, 最好的祝福, 汤姆。

答案 5 :(得分:0)

如果studentDB为NULL,也可能是访问studentDB指针的name成员是一个段错误。

答案 6 :(得分:0)

从联系手册:

  

free(ptr)释放内存空间   ptr指出,必须有   之前的电话回复了   malloc(),calloc()或realloc()。   否则,或者如果已经免费(ptr)   以前被称为未定义   行为发生。如果ptr为NULL,则为no   操作完成。

还可以检查:

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