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

问题描述 投票:-2回答:1

[我已将结构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相同的确切位置。

c pointers struct typedef
1个回答
0
投票

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

[之后,再次在next上更改node0字段以指向node2node0->next = node1所以(node0->next)->next = node2

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

然后您以(node->next)->data仍为node的方式打印node0,因此打印3

然后从函数返回打印node0->datanode1->data后,请记住,您没有更改node1中的node2func。因此输出就是我们应该期望的结果。

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

作为旁注,应避免强制转换malloc的返回值,请参见f.ex。 this question

© www.soinside.com 2019 - 2024. All rights reserved.