C语言中typedef struct重定义指针作为函数参数的问题
问题解析:typedef定义的指针类型作为参数为何无法修改原变量?
核心本质:C语言的值传递机制
C语言里所有函数参数都是值传递——不管你传的是普通变量还是指针,函数拿到的都是原变量的副本。你的问题根源在于:当参数本身是指针时,修改副本的指向不会影响原指针的内容。
代码问题拆解
你用typedef struct Per* Person把Per*重命名为Person,所以main里的Person p本质是Per* p——这是一个指针变量,它存储的是指向Per结构体的内存地址(初始为NULL)。
调用InitPerson(p)时:
- 函数接收到的是
p的副本(一个全新的Per*变量,初始值同样是NULL) - 在
InitPerson里给这个副本赋值malloc(sizeof(Per)),只是修改了副本的指向,和main里的原p没有任何关联 - 函数执行完毕后副本被销毁,main里的
p依然是NULL,后续调用PrintPerName自然会触发错误
为什么InitPerson2能正常工作?
InitPerson2的参数是Person*,也就是Per**——这是指针的指针,传入的是main里p这个变量的内存地址。
- 函数里的
*p = malloc(...),本质是直接修改main里p变量的内容(把malloc分配的内存地址写入p中) - 这样main里的
p就不再是NULL,而是指向了合法的结构体内存,调用PrintPerName就能正常访问结构体成员
关键结论
- 要修改任意变量的值(无论这个变量是普通类型还是指针类型),都需要将该变量的地址传递给函数
- 你的
Person是指针类型,它本身也是一个变量,要修改它存储的地址值,就必须传递它的地址(即Person*),而不是直接传递它的副本
内容的提问来源于stack exchange,提问作者Seraphine
相关产品推荐
相关产品推荐

