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
相关产品推荐
相关产品推荐

