定义了一个结构体指针,带入函数显示未初始化

初始化一个节点
定义了一个结构体,里面的数据域和指针域

在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的值。

请注意,无论选择哪种解决方案,都要确保在使用指针之前进行了正确的内存分配和释放,以避免内存泄漏或悬挂指针的问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^