gpt4 book ai didi

c - 在函数的结构体中修改指针的正确方法是什么?我做错了吗?

转载 作者:行者123 更新时间:2023-11-30 20:29:13 24 4
gpt4 key购买 nike

我已经将结构定义为node1,现在在main()函数中创建了3个指向节点node1 node2的指针,这些指针指向类型为node1(即我创建的结构节点)的指针。

在第一段代码中,我输出了

3
9
2


这意味着当我在函数内部更改 node->next时,它本身并没有反映在主函数中,它仅在函数内部起作用,尽管我在这里使用了按引用调用(下一段代码)

我做错了吗?



#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
};
void func(struct Node* node) {
node->data = 9;
node->next = (node->next)->next;
printf("%d\n", (node->next)->data);
}

int main() {
struct Node *node0, *node1, *node2;

node0 = (struct Node *)malloc(sizeof(struct Node));
node1 = (struct Node *)malloc(sizeof(struct Node));
node2 = (struct Node *)malloc(sizeof(struct Node));
node0->data = 1;
node0->next = node1;
node1->data = 2;
node1->next = node2;
node2->data = 3;
node2->next = NULL;

func(node0);
printf("%d\n%d", node0->data, node1->data);
}


现在这是我首先通过引用编写的代码,该ne也给出了相同的输出

我想要的输出是

3
9
3


因此,即使通过引用进行调用也不起作用,对此有什么解决方案呢?

#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
};

void func(struct Node **node) {
(*node)->data = 9;
((*node)->next) = (((*node)->next)->next);
printf("%d\n", ((*node)->next)->data);
}

int main() {
struct Node *node0, *node1, *node2;

node0 = (struct Node *)malloc(sizeof(struct Node));
node1 = (struct Node *)malloc(sizeof(struct Node));
node2 = (struct Node *)malloc(sizeof(struct Node));
node0->data = 1;
node0->next = node1;
node1->data = 2;
node1->next = node2;
node2->data = 3;
node2->next = NULL;

func(&node0);
printf("%d\n%d", node0->data, node1->data);
}


什么是正确的方法?

我想要一个解决方案,以在不返回和重新分配的情况下修改结构内部的指针。

所以这就是我想要的。函数调用后,我希望node1变量指向与node2相同的确切位置。

最佳答案

因此,在func中,您仅会变异(更改)传入的节点node0
在调用func之前,它看起来像这样:node0->node1->node2->NULL
然后在func中更改传入节点datanode0字段。

之后,再次在next上更改node0字段,使其指向node2
node0->next = node1如此(node0->next)->next = node2

现在看起来像这样的node0->node2->NULLnode1->node2->NULL,您尚未更改node1node2的任何内容。

然后,您在(node->next)->data仍为node的情况下打印node0,因此您打印3

然后,从函数返回后,打印node0->datanode1->data,请记住您没有更改node1node2。所以输出就是我们应该期望的。

如果我正确理解了您的问题,则希望func变量指向调用node1node2指向的相同内存。实际上,这不是从func内部完成的,因为func只是node0->next地址的副本。您更改了该副本,但是node1无法访问func变量,因此无法更改它。即使可以,也会导致内存泄漏,因为您无法在node1上调用free

作为附带说明,您应该避免强制转换malloc的返回值,请参见f.ex。 this question

关于c - 在函数的结构体中修改指针的正确方法是什么?我做错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com