如何解决分段故障(核心转储)?

时间:2016-11-22 01:40:09

标签: c algorithm segmentation-fault coredump

我有这个代码,我不知道为什么之后,我问你是否想要介绍另一个学生,我说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;
}

如何解决问题。

1 个答案:

答案 0 :(得分:0)

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

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

在这一行

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

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

使用起来要简单得多:

}while (respuesta == '1');