11

free在ing 某个指针后出现分段错误:

free(studentDB->name);

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

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

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

4

7 回答 7

16

如果你不malloc()这样做,你就做不到free()。从哪里来studentDB->name

于 2010-02-21T21:38:11.203 回答
3

您可能已经对其进行了 free() 处理,或者使用缓冲区溢出覆盖了块之前的 malloc 信息

于 2010-02-21T21:38:35.573 回答
2

通常在程序的其他地方堆损坏。堆通常是连续的,堆管理器用标题包围堆块以跟踪块 - 如果覆盖块的标题,则可以访问它,但free很可能会失败。

于 2010-02-21T21:40:04.197 回答
0

段错误 fromfree可能是通过在未分配的指针上调用它引起的malloc,或者已经被free'd 了。

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

于 2010-02-21T21:38:57.693 回答
0

之前有studentDB->name分配吗?如果您没有为该字段分配内存,那么当您调用 时free,您可能会遇到 seg-fault!请检查该字段并确保其为mallocd 或strdupd。

或者堆上的其他地方存在损坏,正如您正确指出的那样,您可以看到name...的价值。

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-21T21:41:50.300 回答
0

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

于 2010-02-21T21:49:53.197 回答
0

从手册页:

free( ptr ) 释放 ptr 指向的内存空间,该空间必须由先前对 malloc()、calloc() 或 realloc() 的调用返回。否则,或者如果之前已经调用过 free(ptr),则会发生未定义的行为。如果 ptr 为 NULL,则不执行任何操作。

还可以检查:

  1. studentDB 是指向包含成员“名称”的类/结构的非空指针吗?
  2. studentDB->name 指向的空间是否被 malloc/calloc/realloc 返回?
于 2010-02-21T23:47:18.853 回答