C语言结构体LISTA指针未正确初始化触发段错误问题求助
问题根源
段错误由C语言值传递规则和指针使用错误共同触发,具体错误点如下:
- 错误1:
crearLista传参逻辑错误
C语言所有参数均为值传递,主函数中定义的LISTA *lista1本身是未初始化的野指针,直接将lista1作为参数传入crearLista时,函数接收到的只是指针的副本,函数内部对副本的修改完全不会影响主函数中原lista1变量,调用结束后lista1还是野指针,你调试看到的0x0只是野指针的一种随机取值。 - 错误2:
crearLista函数实现错误
函数内部定义的LISTA nueva是栈上局部变量,函数返回后该内存会被自动回收;同时你直接对入参Lista执行解引用操作*Lista = nueva,此时Lista本身是传入的野指针,解引用野指针会直接触发段错误。
修复方案
第一步:修改crearLista的声明与实现
改用返回堆分配结构体指针的方式实现初始化,首先修改LISTA.h声明:
typedef struct lista LISTA; // 调整为返回初始化完成的LISTA指针 LISTA* crearLista(void); void agregarLista(LISTA *Lista, void *elem);
再修改LISTA.c的实现,补充堆内存分配逻辑:
#include <stdlib.h> LISTA* crearLista(void) { // 在堆上分配LISTA结构体的内存空间 LISTA *nueva = malloc(sizeof(LISTA)); // 此处补充你自己的LISTA结构体内部成员初始化逻辑 // 例如成员指针赋空、长度变量赋0等操作 return nueva; }
第二步:修改主函数调用逻辑
int main(int argc, char const *argv[]) { // 直接接收crearLista返回的已初始化指针 LISTA *lista1 = crearLista(); LISTA *lista2 = crearLista(); STR *s = crearSTR("Hola"); NUMBER *n = crearNRO(10); agregarLista(lista1, s); agregarLista(lista1, n); agregarLista(lista1, lista2); destruirSTR(s); destruirNRO(n); // 补充:程序退出前要调用对应销毁函数释放lista1、lista2的堆内存,避免内存泄漏 }
额外说明
如果坚持要通过传参的方式完成初始化,需要传入二级指针:函数声明调整为void crearLista(LISTA **Lista),调用时传入&lista1,函数内部通过*Lista = malloc(sizeof(LISTA))完成外部指针赋值。
内容的提问来源于stack exchange,提问作者Andythem
相关产品推荐
相关产品推荐

