C语言结构体指针初始化问题。

#include "stdio.h"
#include "stdlib.h"

struct Student{
    int age;
};

void Init(struct Student* pStudent)
{
    pStudent = (struct Student*)malloc(sizeof(Student));
} 

int main()
{
    struct Student *pStudent;
    Init(pStudent);
    pStudent->age = 1;
    return 0;
}

这段代码会奔溃,我调试发现指针pStudent没有初始化成功。然后我在Init里面修改pStudent->age的值是没问题的,请大家指点一下

阅读 10k
6 个回答
#include "stdio.h"
#include "stdlib.h"

struct Student{
    int age;
};

struct Student* Init()
{
    struct Student* pStudent = (struct Student*)malloc(sizeof(Student));
    return pStudent;
} 

int main()
{
    struct Student *pStudent = Init();
    pStudent->age = 1;
    free(pStudent);
    return 0;
}

PS: C语言传递参数都是值语义,所有的东西都是拷贝。想要修改就得传递指针,你现在想要修改一个指针,那么就得传递一个指针的指针。void Init(struct Student** pOut)这种也是可以得。一般推荐返回一个指针。

Init()里面的malloc得到的那个pStudent没有被传出去过, main里的那个pStudent一直是野指针

可以通过二级指针:

include "stdlib.h"

struct Student{

int age;

};

void Init(struct Student** pStudent)
{

*pStudent = (struct Student*)malloc(sizeof(Student));

}

int main()
{

struct Student **pStudent;
Init(pStudent);
*pStudent->age = 1;
return 0;

}

难道不是分配内存写错了?

难道不是分配内存写错了?

楼上的答案已经很好了,补充一下,C语言只有值传递,没有引用传递。你这种用法传进去的指针其实也是做了一个拷贝,只不过里面存的地址不变,可以通过这个地址访问到原来的变量。可以做一个存放这个结构体指针的指针来传递数据

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进