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

C语言链表头插函数调用后头指针仍为NULL问题排查

问题根因

C语言函数参数采用值传递规则,你的代码存在两个直接导致节点添加失败的问题:

  • 形参与实参类型不匹配:调用addPoint时你传入的是头指针的地址&down,类型为Point**(指向Point结构体指针的指针),但函数形参定义为Point*(一级结构体指针),类型不兼容会导致参数传递逻辑完全不符合预期,正常编译时会抛出类型不匹配警告。
  • 指针修改逻辑作用域错误:即便你把形参改成一级指针、直接传入down作为参数,函数内部的head也只是外部down指针的栈上副本,你在函数内给head赋值新节点地址,修改的只是临时副本,函数返回后临时变量销毁,外部的down指针不会发生任何变化,最终还是初始值NULL。
修正方案

要在函数内部修改外部指针变量的指向,必须传入该指针变量的内存地址,用二级指针类型形参接收,通过解引用操作直接修改外部原始指针的值。
修正后的函数实现:

void addPoint(Point **head, int x, int y, SDL_bool dir) {
    Point *p = malloc(sizeof(Point));
    // 增加内存分配失败判断,避免空指针访问
    if (p == NULL) {
        return;
    }
    p->x = x;
    p->y = y;
    p->dir = dir;
    p->next = *head; // 解引用拿到原始链表头,挂到新节点的next上
    *head = p; // 解引用修改外部头指针指向,让头指针指向新添加的节点
}

头指针初始化、函数调用的代码不需要改动,保持原有写法即可:

// 头指针初始化
Point *down = NULL;

// 调用添加节点函数
addPoint(&down, x * grid_cell_width, (y - 1) * grid_cell_height, SDL_FALSE);

提示:后续链表使用完后,需要从头指针开始遍历逐个释放节点内存,避免内存泄漏。

内容的提问来源于stack exchange,提问作者ademersseman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:06:57