c - 即使使用 malloc 和 strcpy 时,多个节点值也都指向相同的值

标签 c pointers nodes

编辑:只是想学习 C,并且有 Python 背景,希望我不会因此而受到太多反对。

我有这个结构:

struct TreeNode {
    char *value;
    struct TreeNode *sibling;
    struct TreeNode *child;
};

我有这个代码来创建节点:

struct TreeNode* create_node(const char* value) {
    struct TreeNode node;
    node.value = malloc(sizeof(char) * (strlen(value) + 1));
    strcpy(node.value, value);
    node.sibling = NULL;
    node.child = NULL;
    struct TreeNode* node_ptr = &node;
    return node_ptr;
}

这是另一个创建节点的函数中的代码(其中值是字符串数组):

struct TreeNode a = create_node(values[0]);
struct TreeNode b = create_node(values[1]);
struct TreeNode c = create_node(values[2]);
struct TreeNode d = create_node(values[3]);
printf("%s\n", a->value);
printf("%s\n", b->value);
printf("%s\n", c->value);
printf("%s\n", d->value);

当我编译并运行它时,它会打印 values[3] 四次(这意味着节点 a、b、c 和 d 的值都是 values[3] >)。

问题 1)为什么它们都具有相同的值?

注意:正常工作的代码是:

struct TreeNode* create_node(const char* value) {
    struct TreeNode* node = malloc(sizeof(struct TreeNode));
    node->value = malloc(strlen(value) + 1);
    strcpy(node->value, value);
    node->child = NULL;
    node->sibling = NULL;
    return node;
}

问题2)为什么后者有效,而前者无效?

问题 3)在后者中,不应该是 node->value = malloc(sizeof(char) * (strlen(value) + 1)); 而不仅仅是 节点->值 = malloc(strlen(值) + 1);?

最佳答案

struct TreeNode* create_node(const char* value) {
    struct TreeNode node;
    node.value = malloc(sizeof(char) * (strlen(value) + 1));
    strcpy(node.value, value);
    node.sibling = NULL;
    node.child = NULL;
    struct TreeNode* node_ptr = &node;
    return node_ptr;
}

struct node 是该函数的本地结构,因此当函数返回时它就不再存在。但你返回一个指向它的指针。调用者应该如何处理指向不再存在的对象的指针?

关于c - 即使使用 malloc 和 strcpy 时,多个节点值也都指向相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45701852/

相关文章:

c - 标签和 dd 声明在 NASM 中如何工作? C相当于什么?

c - 在 x86 Assembly 中组装代码时出错

当属性值不同时XSLT合并节点

c++ - 运行时错误。我知道在哪里,但我不知道为什么以及如何纠正它

Java 使用 LinkedList 的节点

c++ - 访问类中的结构成员,LinkedList Node

c# - 这个代码构造的名称是什么 : condition ? true_expression: false_expression

c - 获取png图像的高度和重量

c++ - 删除指针数组

c++ - 我是否正确理解指针? C++