如何解决分段错误(核心转储)?

How can I solve the segmentation fault (core dumped)?

我有这段代码,我不知道为什么之后,我问你是否要介绍另一个学生,我说 1 或 0 程序结束并说分段错误(核心转储)。

我想介绍 _nodo *insertaEnLista

的另一个学生
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

struct actividades
{
  char tipoDeActividad[22];
  char diaDeLaSemana[12];
  char horaDeIncio[8];
  char horaDeFin[8];
};

struct materias
{
   char nombre[30];
   char profesor[30];
   char tipoDeMateria[20];
   struct actividades *actividad;
};

struct alumnos
{
   char nombre[30];
   int cedula;
   int telefono;
   struct materias *materia;
   struct alumnos *siguiente;
};

typedef struct alumnos _nodo;

_nodo *crearLista(_nodo *apuntador);
bool listaVacia(_nodo *apuntador);
_nodo *insetarEnLista(char nombre[], long  cedula, long  telefono, _nodo *apuntador);
void imprimirLista (_nodo *apuntador);
_nodo *crearNodo(char nombre[], long int cedula, long int telefono);

//AQUI SE CREA LISTA Y SE PONE PARA QUE APUNTE A NULL
_nodo *crearLista(_nodo *apuntador)
{
    return (apuntador = NULL);
}

//ESTA FUNCION VERIFICA SI LA LISTA ESTA VACIA 
bool listaVacia(_nodo *apuntador)
{
    if (apuntador == NULL)
        return (true);
    else
        return (false);
}

//AQUI SE CREA EL NUEVO NODO DE LA LISTA

_nodo *crearNodo(char nombre[], long cedula, long telefono)
{
    _nodo *registroNuevo;

    registroNuevo = (_nodo *) malloc(sizeof(_nodo));

    printf("\n----NUEVO ELEMENTO----\n");
    printf("NOMBRE: ");
    fflush(stdin);
    scanf("%s",nombre);
    printf("CEDULA: ");
    fflush(stdin);  
    scanf("%ld", &cedula);
    printf("TELEFONO: ");
    fflush(stdin);  
    scanf("%ld", &telefono);
    fflush(stdin);

        strcpy(registroNuevo->nombre, nombre);
        registroNuevo->cedula = cedula;
        registroNuevo->telefono = telefono;
        registroNuevo->siguiente = NULL;

    return registroNuevo;   

}

//AQUI SE INSERTA EL NODO EN LA LISTA LUGEO DE SER CREADO POR LA FUNCION crearNodo
_nodo *insetarEnLista(char nombre[], long  cedula, long  telefono, _nodo *apuntador)
{
    _nodo *registroNuevo, *apuntadorAuxiliar;
    char respuesta,ch;

    do
    {

            registroNuevo=crearNodo(nombre, cedula, telefono);
            if (listaVacia(apuntador)) apuntador = registroNuevo;
            else
            {
                apuntadorAuxiliar = apuntador;
                while (apuntadorAuxiliar->siguiente != NULL)
                    apuntadorAuxiliar = apuntadorAuxiliar->siguiente;
                apuntadorAuxiliar->siguiente = registroNuevo;
            }

            printf("\nPARA INGRESAR A OTRO ALUMNO MARQUE... 1");
            printf("\nPARA SALIR MARQUE... '0'\n");         
     while((ch = getchar()) != EOF && ch != '\n');      

    scanf("%c", &respuesta);
        fflush(stdin);
   printf("RESPUESTA = %c", respuesta);             

    }while (strcmp(&respuesta, "1")==0);
    return apuntador;
}

//IMPRIMIR LOS NODOS DE LA LISTA
void imprimirLista (_nodo *apuntador)
{
    _nodo *apuntadorAuxiliar;

    apuntadorAuxiliar = apuntador;

    if (apuntador == NULL)
        printf("NO HAY ELEMENTOS EN LA LISTA \n");
    else
    {
        while(apuntador != NULL)
        {
            printf(" \n------------NODO-------------- ");
            printf("\nNOMBRE: %s \n\n", apuntadorAuxiliar->nombre);
            printf("\n\nCEDULA: %d \n", apuntadorAuxiliar->cedula);
            printf("\nTELEFONO: %d \n", apuntadorAuxiliar->telefono);

            apuntadorAuxiliar = apuntadorAuxiliar->siguiente;
        }
    }

    return;
}

int main()
{
    /*printf("INTRODUZCA LOS NUMEROS DE CEDULA QUE DESEA IMPRIMIR \n");*/

    _nodo *inicioLista;
    int cedula;
    int telefono;

    char nombre[20];

    inicioLista = crearLista(inicioLista);

    inicioLista = insetarEnLista(nombre, cedula, telefono, inicioLista);

    imprimirLista(inicioLista);

    return 0;
}

我该如何解决这个问题。

您应该在调试器中逐步执行代码并查看每一步的变量以确定导致问题的代码行。

这是一个问题,可能还有其他问题。

在这一行

}while (strcmp(&respuesta, "1")==0);

您正在使用 strcmp 和包含单个字符的变量 (respuesta)。 strcmp 需要一个以空字符结尾的字符串(末尾为零字节的字符数组)。由于变量后可能没有零字节,这可能会导致 strcmp 读取它不应该读取的内存(这是缓冲区溢出)

使用起来更简单:

}while (respuesta == '1');