Fallo de segmentación

¿Alguien podría decirme por qué obtengo un error cuando intento presionar

   #include <stdio.h>


typedef struct Element
{
  struct Element *next;
  void *data;
}Element;

bool createStack(Element **stack)
{
  *stack = NULL;
  return true;
}

bool push (Element **stack, void *data)
{
  Element *new_element = new Element;

  if(!new_element)
  {
    printf("Memory allocation error in push");

    return false;
  }

  new_element->data = data;
  new_element->next = *stack;
  *stack            = new_element;
  return true;

}

bool pop (Element **stack, void *popped_data)
{
  if(!*stack)
  {
    printf("Stack empty");

    return false;
  }


  Element *new_head = new Element;

  popped_data   = (*stack)->data;
  new_head      = (*stack)->next;
  delete *stack;
  return true;

}

bool emptyStack(Element **stack)
{
  if(!*stack)
  {
    printf("Stack empty");

    return false;
  }

  Element *delete_ele;

  while(*stack)
  {
    delete_ele=*stack;
    *stack = delete_ele->next;
    delete delete_ele;
  }

  return true;

}

int main()
{

  int i,*j;
  Element *stacka = new Element;

  while(i!=5)
  {
    printf("Enter ur choice \n");
    scanf("%d",&i);

    if(i==1)
    {
      if(createStack(&stacka))
      {
        printf("yes");

      }
    }

    if(i==2)
    {
      *j=2;
      if(push(&stacka,j))
      {
        printf("yes");

      }
    }

    if(i==3)
    {
      if(pop(&stacka,j))
      {

        printf("yes %d",*j);


      }
    }

    if(i==4)
    {
      if(emptyStack(&stacka))
      {
        printf("yes");

      }
    }

  }
return 0;
}

Gracias por la ayuda para ejecutarlo en ubuntu.

preguntado el 27 de agosto de 11 a las 19:08

¿Por qué está etiquetado? c++? Aparte de la new palabra clave, este es el código C. Necesitas obtener un buena reserva en C ++, o acepta que estás aprendiendo C en su lugar. -

Compilando con g++ -Wall huellas dactilares warning: ‘j’ may be used uninitialized in this functiony te habría ahorrado la molestia de publicar aquí. -

@koool: Haz que esa sea tu próxima prioridad: ¡aprende a usar un depurador! Es una herramienta indispensable para un programador. ¡Haga lo que dice Keith para compilar con las advertencias habilitadas y no las ignore! Y encontrar un buen libro introductorio de C ++¡Eso será de gran ayuda! -

sí lo hace. Y no "insinué" nada. No creo que "implicar" signifique lo que tú crees que significa. Llamar a alguien idiota cuando se comporta como un idiota no es una implicación. -

@koool: Si puede manejar gdb, debería estar bien por ahora. El paso único, el uso de puntos de interrupción y la observación de los valores de las variables deberían ser suficientes para resolver muchos problemas. Cuando eso falle, siempre puedes venir y preguntar aquí :) Ah, y en el futuro, intenta reducir tu código a una pieza lo más corta posible que aún reproduzca tu problema. A menudo, puede resolver el problema usted mismo con solo hacerlo. Hay mucho más que aprender en el camino por delante. ¡Divertirse! -

2 Respuestas

Esta en esta linea

*j = 2;

j no está inicializado en ese momento.

Deberías empujar &k dónde k es un into inicializar j = new int. Evitar la pérdida de memoria depende de usted en el último caso.

Respondido 27 ago 11, 23:08

También pop no se actualiza stack. - Nodo

@unkulunkulu: exactamente, por lo que una vez que ha aparecido un elemento, no puede acceder a ninguno de los siguientes, ni puede usar la variable pasada a pop sin peligro. - Nodo

Bonito !! @Node yup jus noté que corregido ... gracias por señalar - koool

@koool: pop también está filtrando un elemento en new_head = new Element. Piénselo: si está tomando cosas de la pila, ¿por qué necesita crear algo? - R. Martinho Fernandes

Cuando declaras int i,*j;, j es solo un puntero no inicializado que no apunta a una ubicación de memoria válida. Más tarde, cuando dices *j=2;, elimina la referencia a ese puntero, lo que da como resultado un comportamiento indefinido.

Tienes que asignar una ubicación significativa a j, al igual que:

int j_content;
int *j = &j_content;

Respondido 27 ago 11, 23:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.