我想知道为什么第一种方法不起作用而第二种方法起作用:
//第一种方法
int create_node(struct node *create_me, int init){
create_me = malloc(sizeof(struct node));
if (create_me == 0){
perror("Out of momory in ''create_node'' ");
return -1;
}
(*create_me).x = init;
(*create_me).next = 0;
return 1;
}
int main( void ){
struct node *root;
create_node(root, 0);
print_all_nodes(root);
}
好的,这里 print_all_nodes 函数告诉我,root 尚未初始化。现在第二种方法很好用:
struct node* create_node(struct node *create_me, int init){ //<-------
create_me = malloc(sizeof(struct node));
if (create_me == 0){
perror("Out of momory in ''create_node'' ");
exit(EXIT_FAILURE);
}
(*create_me).x = init;
(*create_me).next = 0;
return create_me; //<---------
}
int main( void ){
struct node *root;
root = create_node(root, 0); //<---------------
print_all_nodes(root);
}
在我的理解中(谈到方法 1),当我给 create_node
函数指向根节点的指针时,它实际上改变了 x
和 next
根目录。
就像你做的那样:
void change_i(int* p){
*p = 5;
}
int main( void ){
int i = 2;
printf("%d\n", i);
change_i(&i);
printf("%d", i);
}
它实际上改变了i
。
明白了吗?
有人可以与我分享他/她的知识吗!
最佳答案
你需要一个指向指针的指针,而不仅仅是一个指针。
如果你想改变另一个函数中的一个变量,你必须发送一个指向那个变量的指针。如果变量是整数变量,则发送指向该整数变量的指针。如果变量是指针变量,则发送指向该指针变量的指针。
你在问题中说“当我给 create_node
函数一个指向根节点的指针时,它实际上改变了 x
和 next
的根目录。”你的措辞让我怀疑这里有些困惑。是的,您正在更改 x
和 next
的内容,但不是 root
的内容。 root
没有x
和next
,因为root
是指向 的指针一个包含 x
和 next
的结构。您的函数不会更改 root
的内容,因为您的函数获取的只是该指针的副本。
对代码的更改:
int create_node(struct node **create_me, int init) {
*create_me = malloc(sizeof(struct node));
if (*create_me == 0){
perror("Out of momory in ''create_node'' ");
return -1;
}
(*create_me)->x = init;
(*create_me)->next = 0;
return 1;
}
int main( void ){
struct node *root;
create_node(&root, 0);
print_all_nodes(root);
}
关于C:处理指针的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34222931/