C语言如何正确初始化双指针?现有代码运行出现段错误如何修复?
问题原因分析
- 核心错误是对函数返回的临时右值取地址,属于C语言标准定义的未定义行为。
api_getTemporalData返回值类型为tDateTimeNode *,返回的是data.timeNodeList的值副本,是没有固定内存地址的临时右值,C语言不允许对右值使用&取地址运算符。- 你把非法获取的临时值地址传入
dateTimeNode_insert后,函数内部对*_list的赋值只会修改临时副本的指向,完全不会影响原变量data.timeNodeList,所以data.timeNodeList始终为NULL,后续printf访问data.timeNodeList->a时直接触发段错误。
小提示:编译C代码时开启
-Wall -Wextra编译选项,这类语法错误会被编译器直接捕获,无需花费时间调试运行时段错误。
修复方案
两种可行修改方式:
方案1:直接传入原指针的地址(最简便)
将main函数中的插入调用行修改为:
dateTimeNode_insert(&data.timeNodeList);
方案2:修改API接口返回二级指针(如果必须通过API获取指针地址)
修改api_getTemporalData实现,返回timeNodeList的地址而非值副本:
tDateTimeNode **api_getTemporalData(tApiData *data) { return &data->timeNodeList; }
对应调用时无需额外取地址:
dateTimeNode_insert(api_getTemporalData(&data));
内容的提问来源于stack exchange,提问作者Antonio Gamiz Delgado
相关产品推荐
相关产品推荐

