【发布时间】:2014-04-28 02:36:38
【问题描述】:
我在尝试使用 c 中的 strcat 连接到字符串时遇到了段错误。 gdb中的错误是:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1 (LWP 1)]
0xff1692b4 in strcat () from /lib/libc.so.1
相关代码如下。我在调用函数中malloc-ing传入的char * returnedString,传入returnString的初始值就是“”。
char * printPostOrder(struct block * node, char * returnedString)
{
char * temp;
temp = (char *)malloc(50 * sizeof(char));
temp[0]='\0';
if(temp){
if (node != NULL)
{
returnedString = printPostOrder(node -> left,returnedString);
returnedString = printPostOrder(node -> right,returnedString);
if (node -> left == NULL || node -> right == NULL)
{
if (node -> flag == 1)
{
sprintf(temp,"(%dA)\0",node -> size);
strcat(returnedString,temp);
free(temp);
}
else
{
sprintf(temp,"(%dF)\0",node -> size);
//printf("%c",temp);
strcat(returnedString,temp);
}
}
free(temp);
}
}
return returnedString;
}
任何帮助将不胜感激!
【问题讨论】:
-
您的基本情况在哪里?您可能内存不足,因为它从不停止创建新节点。你的堆栈太大了。
-
我不是在制作节点,而是在遍历现有节点,打印出大小。我认为只有在节点不为 NULL 时才会再次调用该函数?
-
您不需要执行
returnedString = strcat(returnedString, ...),因为无论如何strcat只会返回retrurnedString。所以你实际上是在做returnedString = returnedString;。然而,这只是一个旁注。这不是您的段错误的原因。 -
当你完成它时,你并没有释放
temp。除此之外,是否有足够的节点使returnedString可能太短?如果新字符串不适合,strcat()将不会分配更多空间... -
现在你释放了两次 temp,但你仍然超出了顶层缓冲区。此外,在节点为 NULL 的情况下,您不会释放 temp。
标签: c recursion segmentation-fault strcat