- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经将结构定义为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);
}
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);
}
最佳答案
因此,在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
后node2
指向的相同内存。实际上,这不是从func
内部完成的,因为func
只是node0->next
地址的副本。您更改了该副本,但是node1
无法访问func
变量,因此无法更改它。即使可以,也会导致内存泄漏,因为您无法在node1
上调用free
。
作为附带说明,您应该避免强制转换malloc的返回值,请参见f.ex。 this question。
关于c - 在函数的结构体中修改指针的正确方法是什么?我做错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678957/
我是一名优秀的程序员,十分优秀!