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

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

我将struct定义为node1,现在在
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);
}