[我已将结构I定义为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
中更改传入节点data
的node0
字段。
[之后,再次在next
上更改node0
字段以指向node2
,node0->next = node1
所以(node0->next)->next = node2
。
现在看起来像node0->node2->NULL
和node1->node2->NULL
,您尚未更改node1
或node2
的任何内容。
然后您以(node->next)->data
仍为node
的方式打印node0
,因此打印3
。
然后从函数返回打印node0->data
和node1->data
后,请记住,您没有更改node1
中的node2
或func
。因此输出就是我们应该期望的结果。
如果我正确理解了您的问题,您希望node1
variable指向在调用node2
之后func
指向的相同内存。由于func
只是地址到node0->next
的副本,因此实际上无法从node1
内部完成。您更改了该副本,但是func
无法访问node1
variable,因此无法更改它。即使可以,也会导致内存泄漏,因为您无法在free
上调用node1
。
作为旁注,应避免强制转换malloc的返回值,请参见f.ex。 this question。