0

Estoy haciendo un proyecto en visual studio 2017 en el lenguaje C, el proyecto consiste en crear funciones para una estructura de datos (Pila con listas ligadas), pero el valor de cada elemento dentro de la pila se guarda con void*, aquí el struct de mi pila:

typedef struct Nodo {
struct Nodo* sig;
void* valor;
}Nodo;

typedef struct Pila {
Nodo* cima;
}Pila;

El problema en cuestión es el manejo de valores a través del uso de una variable puntero en mi función pop:

BOOLEAN lpila_pop(Pila* p, void** valor) {

if (p->cima == NULL) {
    return ERROR;
}
Nodo* eliminar = p->cima;
p->cima = p->cima->sig;
*valor = eliminar;
free(eliminar);
return OK;
}

Agrego la función top para mayor entendimiento:

BOOLEAN lpila_top(Pila* p, void** valor) {

if (p->cima == NULL) {
    return ERROR;
}
*valor = p->cima->valor;
return OK;
}

Al llamarlo desde el main de esta manera:

int value1 = 1;
int value2 = 2;
int value3 = 3;
int value4 = 4;


Nodo* pila = lpila_crear(&value1);

lpila_push(pila, &value2);
lpila_push(pila, &value3);
lpila_push(pila, &value4);

void* retval;
lpila_top(pila, &retval);
printf("Valor en la cima: %d\n", *((int*)retval));

lpila_pop(pila, &retval);
printf("Valor extraido de la pila: %d\n", *((int*)retval));

Ocurre esto:

Valor en la cima: 4

Valor extraido de la pila: -572662307

En vez de mostrar el valor en la dirección de memoria, muestra la dirección de memoria en sí.

Me gustaría entender el por qué, ya que en el caso de top y pop el valor se guarda de la misma manera.

2
  • 1
    ¿No debería ser *valor = eliminar->valor; en lpila_pop?
    – FJSevilla
    Commented el 27 jun. a las 17:30
  • @FJSevilla así es, ya funcionó, gracias
    – SebaKisser
    Commented el 27 jun. a las 17:51

1 respuesta 1

0

Te interesa el valor, no el nodo:

Nodo* eliminar = p->cima;
p->cima = p->cima->sig;
*valor = eliminar->valor;
free(eliminar);

En este caso, seguramente el compilador no te esté dando ninguna pista por la conversión implícita que existe de cualquier tipo de puntero a void*.

Por cierto, debería ser:

Pila* pila = lpila_crear(&value1);

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.