【发布时间】:2014-12-22 09:51:11
【问题描述】:
我在以下代码中得到了segmentation fault (core dumped)(我正在实现malloc()、free() 和realloc()):
void free(void* ptr)
{
void* curr = head;
void* before = NULL;
int isLegal = 0;
/*Line X*/printf("curr is %p and ptr is %p\n", curr, ptr);
if(curr == ptr)
{
printf("aaa");
}
else
{
printf("bbb");
}
/*Some more code that actually frees the pointer and not relevant here*/
}
现在,您假设它会打印 aaa 或 bbb,它只是在执行第 X 行中的 printf() 后立即宣布分段错误。如果我输入“printf("a")”而不是当前的printf(),它根本不会打印'a'。这真的很奇怪。
它打印:
curr is 0x86be000 and ptr is 0x86be000
但它会立即退出并引发分段错误。
变量head 是该文件中的静态变量。我真的很想知道问题出在哪里,真的很奇怪。这是头文件中的语句:
void free(void* ptr);
就这么简单,你觉得这里有什么问题吗? 完整代码可在here 获得,但我怀疑它是否相关,该程序至少应该打印“aaa”或“bbb”,但它不会这样做。 任何的想法?我真的很绝望。
【问题讨论】:
-
由于您不打印换行符或使用
fflush,因此您的 printf 输出并未被清除。如果您正在使用它们进行调试,则应该在每个打印语句上使用换行符。 -
@JS1 我不明白,你基本上是说我应该添加一个 '\n' 或使用 'fflush(stdout)' ?两者都不合作。
-
那么,在您更改
aaa和bbb以添加换行符后,您在输出中看不到任何一个,但您仍然看到以前的 printf 输出?我并不是说它会修复你的 segv,只是你应该看到aaa或bbb。 segv 可能会在以后发生。 -
@JS1 哦,将 '\n' 添加到 'aaa' 和 'bbb',是的,它正在工作!非常感谢!
-
那你抱怨 seg fault 的原因是什么?