c - strcat 上的段错误

标签 c strcat

所以我的代码中出现段错误,但我似乎无法弄清楚是什么原因造成的。有人能捕获我没有的东西吗?

从逻辑上讲,我试图通过将内容连接到末尾来创建一个 char 数组(一个字符串),然后将其添加到一个字符串数组中。

它最终应该是这样的 'word1, word2, word3, word4, word5... etc'

段错误发生在 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 的返回值,以防它失败).

第二个是您可以这样简化字符串构造,而无需在 while 中使用 if 语句:

strcpy(str, curNode->word);
graphNode *prev = curNode->prevWord;
while (prev != NULL) {
    strcat (str, ", ");
    strcat(str, prev->word);
    prev = prev->prevWord;
}

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

相关文章:

c++ - 从 'char'到 'char*' strcat函数的无效转换

c - 冒泡排序双向链表

编译错误,成员不是 union 体的成员 |使用指针/结构

c++ - 在函数返回后释放动态分配的结构数组。

c - Linux 的 dos.h?

c - 我似乎不知道如何使用 strcat 连接两个 char 指针字符串,这不正确吗?

C编程将链表分成两半

c - 从字符串的可选点删除一个字符

C 缩写程序返回 "Segmentation fault"

C Strcat valgrind 错误