编辑:只是想学习 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/