所以我的代码中有一个seg错误,而我似乎不知道是什么导致了它。有人能抓住我没有的东西吗?
在逻辑上,我试图创建一个char数组(一个字符串),方法是将内容连接到字符串的末尾,然后将其添加到一个字符串数组中。
它最终应该是这样的“word1,word2,word3,word4,word5。。。等
seg故障发生在strcat(str, ", ");

void save_ladder(graphNode *curNode) {

    char *str = malloc(1000 * sizeof(char));

    strcpy(str, "");
    strcat(str, curNode->word);
    strcat(str, ", ");

    graphNode *prev = curNode->prevWord;
    while (prev != NULL) {
            if (prev->prevWord != NULL) {
                strcat(str, prev->word);
                strcat(str, ", "); // SEG FAULT HAPPENS HERE
            }
            else
                strcat(str, prev->word);

            prev = prev->prevWord;
    }

    ladders[numLadders++] = str;
}

gdb堆栈跟踪:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004013d1 in save_ladder (curNode=0x6420f0) at wordladder.c:150
150             strcat(str, ", ");

有人知道为什么会这样吗?

最佳答案

可能是缓冲区溢出。将以下代码放在while循环中,并检查是否存在这种情况:

printf ("%d %d\n", strlen (str), strlen (prev->word));

如果这两个数字的和接近1000,你的缓冲区可能需要更大。
或者,如果第二个看起来有点大或者有太多的单词,那么要么列表中的数据,要么列表结构本身就是可疑的。
此外,还有另外两点。第一个是不需要乘以sizeof(char),因为它总是1(如果失败,还应该检查malloc的返回值)。
第二个是,您可以简化字符串构造,因此在if中不使用while语句:
strcpy(str, curNode->word);
graphNode *prev = curNode->prevWord;
while (prev != NULL) {
    strcat (str, ", ");
    strcat(str, prev->word);
    prev = prev->prevWord;
}

关于c - strcat上的seg错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13785997/

10-12 16:09