初始化一个节点
定义了一个结构体,里面的数据域和指针域
在main函数中定义了一个 ps指针
把ps带入初始化函数,显示ps未初始化
但是,把函数内容调到main函数就可以正确运行
代码如下:
//}
typedef struct s {
int data;
struct s* next;
}s;
void init(s* ps)
{
ps = (s*)malloc(sizeof(s));
ps->next = NULL;
}
int main()
{
s* ps;
//init(ps); //运行此句,显示未初始化
ps = (s*)malloc(sizeof(s));
ps->next = NULL; //运行这两句,正常运行
return 0;
}
请问这是什么意思
初始化函数的形参用两级指针,修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
//}
typedef struct s {
int data;
struct s* next;
}s;
void init(s** ps) //void init(s* ps) 修改
{
(*ps) = (s*)malloc(sizeof(s)); // 修改
(*ps)->next = NULL; // 修改
}
int main()
{
s* ps;
init(&ps); //运用两级指针 修改
return 0;
}
void init(s* ps)
这是作用不到调用者的,需要双指针
void init(s** ps)
{
*ps = (s*)malloc(sizeof(s));
(*ps)->next = NULL;
}
int main()
{
s* ps;
init(&ps); //运行此句,显示未初始化
//ps = (s*)malloc(sizeof(s));
ps->next = NULL; //运行这两句,正常运行
return 0;
}
【以下回答由 GPT 生成】
问题解答:
在C语言中,函数参数是按值传递的,这意味着在函数内部对指针进行赋值,只会修改函数内部的副本,而不会影响原来的指针。
在你的代码中,init
函数的参数是一个指向s
结构体的指针s* ps
。在init
函数内部,你对参数ps
进行了赋值操作,但是这个赋值操作只是修改了函数内部的副本,而不会修改main
函数里的实际指针。
如果你想在init
函数中初始化指针,你可以将指针的地址传递给函数,或者使用指向指针的指针。下面是两种解决方案:
解决方案1:使用指向指针的指针
typedef struct s {
int data;
struct s* next;
} s;
void init(s** pps) {
*pps = (s*)malloc(sizeof(s));
(*pps)->next = NULL;
}
int main() {
s* ps;
init(&ps);
return 0;
}
在这个解决方案中,init
函数的参数是pps
,一个指向指针的指针。在init
函数内部,我们通过*pps
访问并修改main
函数中指针ps
的值。
解决方案2:将指针的地址传递给函数
typedef struct s {
int data;
struct s* next;
} s;
void init(s* ps) {
ps = (s*)malloc(sizeof(s));
ps->next = NULL;
}
int main() {
s* ps;
init(&ps);
return 0;
}
在这个解决方案中,我们将指针ps
的地址作为参数传递给了init
函数。在init
函数内部,我们通过ps
指向的地址来修改main
函数中的指针ps
的值。
请注意,无论选择哪种解决方案,都要确保在使用指针之前进行了正确的内存分配和释放,以避免内存泄漏或悬挂指针的问题。
【相关推荐】