You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:09:21