Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: GGZ en 2 Noviembre 2016, 13:27 PM

Título: [Muy específico] Algo de punteros
Publicado por: GGZ en 2 Noviembre 2016, 13:27 PM
Creo que ya sé la respuesta, pero por si las dudas pregunto.

Básicamente tengo que invertir una pila, una estructura de datos que la represento como:

typedef struct _AStack {
int data[MAX_STACK];
int back;
}AStack;


Acá va la duda:



void astack_reverse (AStack *s){
int i;
AStack *reverse = astack_create();

for (i=s->back; i >=0; i--){
astack_push(reverse,s->data[i]);
}
*s = *reverse;
}


La duda está en la última linea *s=*reverse, lo que estoy haciendo es igualar todos los elementos de s a reverse, (ya sé que no es lo más eficiente).

Ahora si yo hago s = reverse (sin *) lo que pasa es que yo estoy modificando una variable global (estoy modificando la dirección donde apunta) y cuando vuelve al main perdí la información. Eso si entiendo ...

¿Pero por qué acá no pasa lo mismo?

Acá estoy implementando pilas pero con otra estructura:

typedef struct _AStack {
       int *data;
       int size;
       int back;
}AStack;



void astack_push(AStack *s, int v){

       if (s != NULL){
               if (s->size > s->back){
                       s->back++;
                       s->data[s->back] = v;
               }else{
                       s->size*=2;
                       int *new_data = realloc(s->data,(s->size));
                       if (new_data != NULL) s->data = new_data;
                       else printf ("No se pudo asignar memoria.\n");
               }
       }
}



Me refiero a esta parte:

                       int *new_data = realloc(s->data,(s->size));
                       if (new_data != NULL) s->data = new_data;
                       else printf ("No se pudo asignar memoria.\n");



... s->data = new_data;

Siendo que new_data la declaré dentro de la función y s->data también me lo pasaron, ¿es por como funciona el realloc?, estoy casi seguro que sí.

Se me hizo medio largo.
Saludos!