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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:15:05