【问题标题】:Strcpy resulting in segmentation faultstrcpy 导致分段错误
【发布时间】:2018-07-28 15:25:39
【问题描述】:

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

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;
}

【问题讨论】:

  • 显示结构node
  • 您没有为结构分配足够的空间。您需要分配sizeof(*temp)(或sizeof(node))以及字符串空间。由于您没有使用灵活的数组成员,因此您可能需要两次分配;你的肯定是不够的。而且temp->data也没有初始化;它没有指向任何已知的内存。

标签: c strcpy


【解决方案1】:

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

你需要更多类似的东西:

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() 调用来释放结构。但是,您不能创建这些结构的数组(尽管您可以拥有指向此类结构的指针数组)。在树的上下文中,这不太可能成为问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 很好奇这个答案在这里(node *) malloc(sizeof(node));,但不是在这里malloc(strlen(name) + 1);。建议不要演员。
    • 好吧,原来我们不必强制转换它。所以你可以放或不放。应该不会影响结果
    • 同意演员阵容可以存在或不存在,因此混合不会影响结果。然而,程序员应该保持一致,至少在一段代码中(函数、文件、程序、系统——选择你的“一段代码”的大小)。单个函数内部的不一致更像是粗心而不是仔细考虑。
    • 进行这些更改。但是是的,你检测到它是对的..get UV.
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2017-10-20
    • 2014-12-21
    • 2014-06-15
    • 1970-01-01
    • 2012-09-21
    • 2020-10-05
    相关资源
    最近更新 更多