C 在函数的结构中修改指针的正确方法是什么?我做错了吗?怎么做?
我将struct定义为node1,现在在C 在函数的结构中修改指针的正确方法是什么?我做错了吗?怎么做?,c,pointers,struct,typedef,C,Pointers,Struct,Typedef,我将struct定义为node1,现在在main()函数中创建了3个指向节点node1 node2的指针,这些指针指向类型node1(即我创建的struct节点) 在第一段代码中,我得到了输出 3 9 2 这意味着,当我在函数中更改节点->下一个时,它本身不会反映在主函数中,它只在函数中工作,尽管我在这里使用了引用调用(下一段代码) 我做错了吗 代码 #include <stdio.h> #include <stdlib.h> struct Node { int d
main()
函数中创建了3个指向节点node1 node2的指针,这些指针指向类型node1(即我创建的struct节点)
在第一段代码中,我得到了输出
3
9
2
这意味着,当我在函数中更改节点->下一个时,它本身不会反映在主函数中,它只在函数中工作,尽管我在这里使用了引用调用(下一段代码)
我做错了吗
代码
#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);
}
因此,即使通过引用调用它也不起作用,对此有什么解决方案
#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);
}
#包括
#包括
结构节点{
int数据;
结构节点*下一步;
};
void func(结构节点**节点){
(*节点)->数据=9;
(((*节点)->next)=(((*节点)->next)->next);
printf(“%d\n”,((*节点)->next)->data);
}
int main(){
结构节点*node0、*node1、*node2;
node0=(结构节点*)malloc(sizeof(结构节点));
node1=(结构节点*)malloc(sizeof(结构节点));
node2=(结构节点*)malloc(sizeof(结构节点));
节点0->数据=1;
node0->next=node1;
节点1->数据=2;
node1->next=node2;
节点2->数据=3;
node2->next=NULL;
func(&node0);
printf(“%d\n%d”,节点0->数据,节点1->数据);
}
正确的方法是什么
我想要一个解决方案,在不返回和重新分配的情况下修改结构内部的指针
这就是我想要的。函数调用后,我希望node1变量指向node2的确切位置。因此,在func
中,您只需变异(更改)传入的节点,node0
。
在调用func
之前,如下所示:node0->node1->node2->NULL
然后在func
中更改传入节点的data
字段,node0
之后,再次在node0
上更改next
字段,以指向node2
,
node0->next=node1
so(node0->next)->next=node2
现在它看起来像是node0->node2->NULL
和node1->node2->NULL
,您没有对node1
或node2
进行任何更改
然后打印(节点->下一步)->数据
,而节点
仍处于node0
状态,因此打印3
然后,从函数返回后,打印node0->data
和node1->data
,请记住,您没有在func
中更改node1
或node2
。因此,输出是我们应该期望的
如果我正确理解了您的问题,您希望node1
变量指向调用func
后node2
指向的内存。这实际上不能从func
内部完成,因为node0->next
只是node1
地址的副本。您可以更改该副本,但func
无法访问node1
变量,因此无法更改它。即使可以,也会导致内存泄漏,因为您无法在node1
上调用free
作为旁注,您应该避免使用malloc的返回,请参见f.ex 由于某些语法错误,第一个代码未编译。第一个代码的行为与您所描述的一样,并提供输出。您希望得到什么样的输出?在func
中,除了传递给函数的原始指针之外,您可以更改任何您喜欢的内容(next
,data
),因为它是main中指针的副本(按值调用)在一张纸上绘制您想要实现的内容的图片,用结构作为矩形,指针作为箭头。表达你想做什么。这正是我想要的。我想要node1变量指向node2指向的地方。所以我想从函数无法做到这一点,因为它只能访问node0。所以唯一的方法就是将node1作为参数传递给函数是的,现在我知道了node0->next和node1是不同的。他们只是指向同一个位置。很抱歉,你很难理解我的问题。这是我关于stackoverflow的第一个问题。答案是superclear。没错。您只能修改该地址的副本。
#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);
}