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

链表出现Segmentation Fault(段错误),请求技术排查帮助

链表段错误问题排查与修复

核心错误点分析

  • 空指针访问触发段错误:inserirFinal函数的else分支中,while(iterador != NULL)会循环到iterador变为NULL,此时执行iterador->proximoNodo = novo_nodo属于访问空指针的成员,直接触发段错误。正确逻辑应该是遍历到最后一个非空节点(即iterador->proximoNodo == NULL时停止)。
  • 未校验malloc返回值:如果内存分配失败,malloc会返回NULL,后续对novo_nodo的操作会导致非法内存访问。
  • gets函数的安全隐患:gets不限制输入长度,若输入超过数组容量会引发缓冲区溢出,破坏内存结构,这也是潜在的崩溃诱因,且该函数已被C标准废弃。

修复后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
  char diretor[50];
  char nome[50];
}Filme;

typedef struct Nodo{
  Filme filme;
  struct Nodo *proximoNodo;
}Nodo;

void adicionarNovoFilme(Nodo *nodo)
{
  Filme filme;

  printf("Diretor:");
  fgets(filme.diretor, sizeof(filme.diretor), stdin);
  filme.diretor[strcspn(filme.diretor, "\n")] = '\0';

  printf("Nome:");
  fgets(filme.nome, sizeof(filme.nome), stdin);
  filme.nome[strcspn(filme.nome, "\n")] = '\0';

  nodo->filme = filme;
}

void inserirFinal(Nodo **nodo_inicial)
{
  Nodo *novo_nodo, *iterador;
 
  novo_nodo = malloc(sizeof(Nodo));
  if(novo_nodo == NULL){
    printf("内存分配失败\n");
    return;
  }

  adicionarNovoFilme(novo_nodo);
  novo_nodo->proximoNodo = NULL;

  iterador = *nodo_inicial;

  if(iterador == NULL)
    *nodo_inicial = novo_nodo;
  else
  {
    while(iterador->proximoNodo != NULL)
      iterador = iterador->proximoNodo;

    iterador->proximoNodo = novo_nodo;
  }
}

额外说明

  • 原Nodo结构体定义中,匿名结构体typedef会导致编译器无法识别struct Nodo类型,修复时改为typedef struct Nodo{...}Nodo;解决类型声明问题。
  • strcspn用于定位换行符位置并替换为字符串结束符\0,避免输入的字符串包含换行符影响后续处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:45:34