Foro de elhacker.net

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:

Código
  1. typedef struct _AStack {
  2. int data[MAX_STACK];
  3. int back;
  4. }AStack;
  5.  

Acá va la duda:


Código
  1. void astack_reverse (AStack *s){
  2. int i;
  3. AStack *reverse = astack_create();
  4.  
  5. for (i=s->back; i >=0; i--){
  6. astack_push(reverse,s->data[i]);
  7. }
  8. *s = *reverse;
  9. }

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:

Código
  1. typedef struct _AStack {
  2.        int *data;
  3.        int size;
  4.        int back;
  5. }AStack;


Código
  1. void astack_push(AStack *s, int v){
  2.  
  3.        if (s != NULL){
  4.                if (s->size > s->back){
  5.                        s->back++;
  6.                        s->data[s->back] = v;
  7.                }else{
  8.                        s->size*=2;
  9.                        int *new_data = realloc(s->data,(s->size));
  10.                        if (new_data != NULL) s->data = new_data;
  11.                        else printf ("No se pudo asignar memoria.\n");
  12.                }
  13.        }
  14. }


Me refiero a esta parte:

Código:
                        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!