Strcpy导致分段错误

时间:2018-02-18 04:27:05

标签: c strcpy

我不确定为什么strcpy会导致分段错误,并且想知道是否有人可以向我解释原因。我最初有temp->data = name,但每次更改名称数组并且正在寻找解决方案时,Node值都会发生变化

typedef struct BST {
        char *data;
        struct BST *left;
        struct BST *right;
}node;



node *create(char name[]){
        node *temp;
        temp = (node *) malloc(strlen(name) + 1);
        strcpy(temp->data, name);
        temp->left = temp->right = NULL;
        return temp;
}

2 个答案:

答案 0 :(得分:4)

根据显示的结构,您分配的内存不足并复制到未初始化的指针。两者都很危险。

你需要更像的东西:

node *create(char name[]){
    node *temp = malloc(sizeof(*temp));
    if (temp == NULL)
        return NULL;
    temp->data = malloc(strlen(name) + 1);
    if (temp->data == NULL)
    {
        free(temp);
        return NULL;
    }
    strcpy(temp->data, name);
    temp->left = temp->right = NULL;
    // temp->generation = 0; // removed from revised question
    return temp;
}

考虑是否可以使用strdup()分配字符串的副本(重复)。你还需要检查一下是否成功。请注意,释放node涉及对free()的两次调用。此外,调用代码需要检查节点是否已成功分配。但是,这段代码对其调用者没有强制执行错误处理策略 - 调用代码可以执行它喜欢的操作,只要它不尝试取消引用代码返回的空指针。

或者,您可以使用C99'灵活的阵列成员'像这样:

typedef struct BST {
    struct BST *left;
    struct BST *right;
    char data[];
} node;


node *create(char name[]){
    node *temp = malloc(sizeof(*temp) + strlen(name) + 1);
    if (temp == NULL)
        return NULL;
    strcpy(temp->data, name);
    temp->left = temp->right = NULL;
    // temp->generation = 0; // removed from revised question
    return temp;
}

现在,您可以通过一次free()调用释放该结构。但是,您无法创建这些结构的数组(尽管您可以拥有指向此类结构的指针数组)。在树的背景下,这不太可能是一个问题。

答案 1 :(得分:3)

你应该首先使用malloc来节点     temp = (node *) malloc(sizeof(node)); 然后malloc你的新字符串     temp->data = (char *) malloc(strlen(name) + 1); 然后你可以使用     strcpy(temp->data, name); 此外,您需要将您的生成设置为您想要的任何值。