free
在ing 某个指针后出现分段错误:
free(studentDB->name);
我可以在没有任何错误或警告的情况下获得它的值:
printf("[DBG] studentDB->name: %s\n", studentDB->name);
但是,正如我所说,当我尝试释放它时程序崩溃了。free
导致分段错误的命令的最常见原因是什么?
free
在ing 某个指针后出现分段错误:
free(studentDB->name);
我可以在没有任何错误或警告的情况下获得它的值:
printf("[DBG] studentDB->name: %s\n", studentDB->name);
但是,正如我所说,当我尝试释放它时程序崩溃了。free
导致分段错误的命令的最常见原因是什么?
如果你不malloc()
这样做,你就做不到free()
。从哪里来studentDB->name
?
您可能已经对其进行了 free() 处理,或者使用缓冲区溢出覆盖了块之前的 malloc 信息
通常在程序的其他地方堆损坏。堆通常是连续的,堆管理器用标题包围堆块以跟踪块 - 如果覆盖块的标题,则可以访问它,但free
很可能会失败。
段错误 fromfree
可能是通过在未分配的指针上调用它引起的malloc
,或者已经被free
'd 了。
如果您将代码发布到studentDB->name
分配的位置,这将有所帮助。
之前有studentDB->name
分配吗?如果您没有为该字段分配内存,那么当您调用 时free
,您可能会遇到 seg-fault!请检查该字段并确保其为malloc
d 或strdup
d。
或者堆上的其他地方存在损坏,正如您正确指出的那样,您可以看到name
...的价值。
希望这会有所帮助,最好的问候,汤姆。
如果 studentDB 为 NULL,那么访问 studentDB 指针的 name 成员也可能是一个段错误。
从手册页:
free( ptr ) 释放 ptr 指向的内存空间,该空间必须由先前对 malloc()、calloc() 或 realloc() 的调用返回。否则,或者如果之前已经调用过 free(ptr),则会发生未定义的行为。如果 ptr 为 NULL,则不执行任何操作。
还可以检查: