首页 文章

Strcpy导致分段错误

提问于
浏览 260
0

我不确定为什么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 回答

  • 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() 调用释放结构 . 但是,你可能不会出现问题 .

  • 3

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

相关问题