链表出现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
相关产品推荐
相关产品推荐

