在free
某个指针之后我得到了一个分段错误:
free(studentDB->name);
我可以在没有任何错误或警告的情况下获得其价值:
printf("[DBG] studentDB->name: %s\n", studentDB->name);
然而,正如我所说,当我尝试释放它时程序崩溃了。 free
命令导致分段错误的最常见原因是什么?
答案 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 操作完成。
还可以检查: