2017-08-17 3 views
0

Bonjour, j'ai besoin de votre aide pour résoudre ce problème.je fait une fonction de Copystack et son pop-up quand j'entre les données de la console j'ai le message suivant erreur erreur SIGSEGV (erreur de segmentation), mais ne pas apparaître lorsque je saisis des données de mon code, je laisse le code des données d'entrée d'une pile et la fonction copystack.erreur SIGSEGV (erreur de segmentation) dans l'algorithme de pile dev C++ (Lenguage c)

/* declaracion */ 
struct tpila{ 
    int clave; 
    struct tpila *sig; 
}; //Stack type 

void crear(struct tpila **pila) //Creation of stack function 
{ *pila = (struct tpila *) malloc(sizeof(struct tpila)); 
    (*pila)->sig = NULL; 
} 

int vacia(struct tpila *pila){ 
    return (pila->sig == NULL); 
} 

void apilar(struct tpila *pila, int elem){ //Stack input function 

    struct tpila *nuevo; 
    nuevo = (struct tpila *) malloc(sizeof(struct tpila)); 
    nuevo->clave = elem; 
    nuevo->sig = pila->sig; 
    pila->sig = nuevo; 
} 

void desapilar(struct tpila *pila, int *elem){ 
    struct tpila *aux; 

    aux = pila->sig; 
    *elem = aux->clave; 
    pila->sig = aux->sig; 
    free(aux); 
} 
void mostrar(struct tpila *pila)//Function print stack 
{ 

    struct tpila *aux; 

    aux=pila->sig; 

    while(aux!=NULL) 
    { 

      printf("%d->",aux->clave); 
      aux=aux->sig; 

    } 
    printf("NULL\n"); 

} 
void copiarPila(struct tpila *pila1,struct tpila *pila2)//Copystack function 
{ 

    struct tpila *pila_aux,*aux; 

    aux=pila1->sig; 

    //Llenamos la pila auxiliar 

    while(aux!=NULL) 
    { 
     apilar(pila_aux,aux->clave); 
     aux=aux->sig; 

    } 

    //Colocamos los datos de la pila auxiliar en la pila 2 

    aux=pila_aux->sig; 

    while(aux!=NULL) 
    { 
     apilar(pila2,aux->clave); 
     aux=aux->sig; 

    } 




} 


int main(void) 
{ 
    struct tpila *pila1,*pila2; 
    bool ingresar_datos=true; 
    int dato; 
    int desicion=2; 


    //Creation of stack 1 a stack 2 
    crear(&pila1); 
    crear(&pila2); 

    printf("Title\n"); 
    printf("-----------------------------------------------\n"); 


    //Colocamos valores a la pila1 


    while(ingresar_datos) 
    { 
    printf("Input a number\n"); 
    scanf("%d",&dato); 
    printf("\n"); 
    apilar(pila1,dato);//Input variable dato 
    printf("To stop input numbers press 2 \n"); 
    scanf("%d",&desicion); 
    system("cls"); 

    if(desicion==2) 
    { 
     ingresar_datos=false; 
    } 
    }   

    printf("Show stack 1 1\n"); 
    mostrar(pila1); 
    printf("-----------------------------------------------\n"); 
    printf("Show stack 2 2\n"); 
    mostrar(pila2); 
    printf("-----------------------------------------------\n"); 
    printf("Copy stack 1 to stack 2\n"); 
    copiarPila(pila1,pila2);----->In this part the program marks the problem 
    printf("-----------------------------------------------\n"); 
    printf("Show stack 2 \n"); 
    mostrar(pila2); 
    printf("-----------------------------------------------\n"); 
    system("pause"); 


} 

Répondre

1

Problème

Comme vous l'avez mentionné, problème commence ici

copiarPila(pila1,pila2); 

Dans cette fonction, vous déclarez un pointeur sur struct, et lui passe non initialisée.

struct tpila *pila_aux; 
apilar( pila_aux ,aux->clave); 

Et en fonction apilar vous accédez à la mémoire non initialisée et de l'écriture, il

nuevo->sig = pila->sig; 
pila->sig = nuevo; 

qui provoque un comportement non défini et programme probablement crash.


Solution

allouent simplement pour mémoire struct tpila *pila_aux et vous ne serez pas SIGSEGV après l'accès/modifier son contenu. N'oubliez pas de libérer ce pointeur.

struct tpila *pila_aux = malloc(sizeof(struct tpila)); 
struct tpila *aux; 
// ... 
// Do stuff here ... 
// ... 
free(pila_aux); 

Vous devez également savoir

  • Why dont cast mallocs return value
  • Il est une bonne pratique d'écrire du code source du programme en anglais, même si elle est seulement pour vous et surtout si vous allez après dans quelque part.