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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:51:03