strcat上的段错误

时间:2017-05-25 20:49:55

标签: c segmentation-fault

我的代码存在段错误,但我真的无法弄清楚原因。

char *cord_tostring(cord_t R) {
    if (R == NULL)
        return NULL;
    char *str = malloc(sizeof(char) * 10000);
    if (R->left == NULL && R->right == NULL)
        return R->data;
    strcat(str, cord_tostring(R->left));
    strcat(str, cord_tostring(R->right));
    return str;
}

其中

typedef struct cord_node *cord_t;
typedef struct cord_node cord;
struct cord_node {
    int len;
    cord *left;
    cord *right;
    char *data;
};

2 个答案:

答案 0 :(得分:2)

您的代码中存在许多问题:

  • 您不检查malloc()是否成功。在许多系统上,malloc()可能会失败并返回NULL。应该测试和报告此类失败,而不是调用未定义的行为。

  • malloc()分配的块未初始化:以strcat()作为目标调用'\0'具有未定义的行为。您应该将其第一个字节初始化为strcpy()或使用strcat()而不是R->left

  • 您测试R->rightNULL before recursing, but if only one of the is, you will be calling NULL with a strcat()data NULL`源指针。

  • 您没有释放为每个节点分配的指针,导致大量内存泄漏,最终导致内存分配失败或更糟。

  • 您连接所有#include <stdio.h> #include <stdlib.h> #include <string.h> char *cord_tostring(cord_t R) { if (R == NULL) return NULL; if (R->left == NULL && R->right == NULL) return R->data ? strdup(R->data) : NULL; char *s1 = cord_tostring(R->left); char *s2 = cord_tostring(R->right); if (s1 == NULL) return s2; if (s2 == NULL) return s1; char *s = malloc(strlen(s1) + 1 + strlen(s2) + 1); if (s == NULL) { fprintf(stderr, "Memory allocation failure\n"); exit(1); } sprintf(s, "%s %s", s1, s2); free(s1); free(s2); return s; } 字段而没有任何分隔符。这可能是预期的行为,取决于您的目标。

以下是使用空格作为分隔符的更正版本:

cord_to_string()

请注意,Public Class Runs Private _RunMailPeices As Dictionary(Of String, MailPiece) = New Dictionary(Of String, MailPiece) Private _run As Integer Private MailDate As DateTime Public Property RunMailPeices As Dictionary(Of String, MailPiece) Get RunMailPeices = _RunMailPeices End Get Set(value As Dictionary(Of String, MailPiece)) _RunMailPeices = value End Set End Property Public Property run As Integer Get run = _run End Get Set(value As Integer) _run = value End Set End Property End Class 的返回值应在使用后释放。

答案 1 :(得分:1)

strcat想要一个NUL终止的字符串

  

strcat()函数应附加指向的字符串的副本   s2(包括终止NUL字符)到字符串的末尾   s1指出。 s2的初始字节会覆盖NUL   s1末尾的字符。如果在对象之间进行复制   重叠,行为未定义。

更改为

char *str = malloc(10000);
str[0] = '\0';

或更好(正如@EugeneSh在评论中所指出的)使用strcpy,它不需要NUL终止符

strcpy(str,cord_tostring(R->left));
strcat(str,cord_tostring(R->right));