dev c ++堆栈算法中的SIGSEGV(分段错误)错误(Lenguage c)

时间:2017-08-17 14:43:30

标签: c pointers segmentation-fault heap

美好的一天,我需要你的帮助解决这个问题。我做了一个copystack功能,当我从控制台输入数据时弹出它我有下一条消息错误 SIGSEGV(分段错误)错误,但是当我从我的代码输入数据时不会弹出,我留下堆栈的输入数据代码和copystack函数。

  /* 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");


}

1 个答案:

答案 0 :(得分:1)

<强>问题

如你所述,问题从这里开始

copiarPila(pila1,pila2);

在这个函数中,你声明了一个指向struct的指针,并且未经初始化地传递给他。

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

在函数apilar中,您正在访问未初始化的内存并在那里写

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

导致未定义的行为,程序可能崩溃。

<强>解决方案

只需为struct tpila *pila_aux分配内存,在访问/修改其内容后您就不会获得SIGSEGV。别忘了释放这个指针。

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

你也应该知道