我的代码存在段错误,但我真的无法弄清楚原因。
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;
};
答案 0 :(得分:2)
您的代码中存在许多问题:
您不检查malloc()
是否成功。在许多系统上,malloc()
可能会失败并返回NULL
。应该测试和报告此类失败,而不是调用未定义的行为。
由malloc()
分配的块未初始化:以strcat()
作为目标调用'\0'
具有未定义的行为。您应该将其第一个字节初始化为strcpy()
或使用strcat()
而不是R->left
。
您测试R->right
和NULL 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));