Cuando ejecuto este código, muestra un error de segmentación.

He buscado la otra publicación relacionada en Stackoverflow pero no obtuve la respuesta o por qué mi código muestra este error.

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct node{
    int info;
    struct node *next;
};
typedef struct node NODE;


NODE* getNode();
void insertAtFirst(NODE*,int);
void traverse(NODE*);

int main(){
    NODE *start = NULL;
    insertAtFirst(start,1);
    insertAtFirst(start,4);
    traverse(start);
    return 0;
}

void insertAtFirst(NODE *start, int n){
    NODE *p = (NODE*)malloc(sizeof(NODE));
    p->info = n;
    if(start == NULL){
        p->next = NULL;
    }
    else{
        p->next = start;
    }
    start = p;
}

void traverse(NODE *start){
    NODE *temp;
    temp = start;
    while(temp != NULL){
        printf("%d  ", temp->info);
        temp = temp->next;
    }
}

Por favor, sugiérame por qué obtengo un error de segmentación (volcado del núcleo) al ejecutar el programa.

0
mia 23 feb. 2017 a las 09:18

2 respuestas

La mejor respuesta
void insertAtFirst(NODE *start, int n){
    NODE *p = malloc(sizeof(NODE));
    p->info = n;
    if(start == NULL){
        p->next = NULL;
    }
    else{
        p->next = start;
    }
    start = p;
}

La última línea start = p no hace lo que cree que hace, no hace que el puntero original dentro de main apunte al nuevo nodo, ya que dentro de la función, start es un copia del puntero original pasado a esta función.

5
giorgim 23 feb. 2017 a las 06:29

Debe compilar con todas las advertencias y la información de depuración (por ejemplo, gcc -Wall -g si usa GCC... ). Luego, mejore su código para no recibir más advertencias.

Entonces debería usar el depurador , p. gdb.

No corregiré su código, pero debe comprender que todos los argumentos (incluidos los punteros) se pasan por valor. Entonces, si se pasa un puntero a alguna función que modifica su argumento, el puntero original permanece sin cambios.

Debería pasar varios días leyendo buenos libros sobre C y sobre programación (y depuración y prueba). También debe leer algún código fuente existente, p. de algún proyecto de software libre.

Por cierto, la capacidad de usar el depurador es una habilidad requerida cuando se codifica en C (o en C ++, por cierto). Así que lea documentación de gdb y tutoriales al respecto.

8
Basile Starynkevitch 23 feb. 2017 a las 06:27