[C con Clase] cout no imprime lo mismo cuando uso estructuras.

Steven Davidson srd4121 en njit.edu
Vie Abr 29 08:33:18 CEST 2011


Hola Miguel,

On 4/29/2011 2:10 AM, Miguel Eduardo Román Martínez wrote:
> Buena noche compañeros, estoy haciendo unos ejemplos de estructuras y
> me sucedió algo curioso:
>
> y es que tengo un codigo algo como esto:
>
> cout << "Ultimo valor ingresado: " << ultimoNodo->valor << endl;
> //imprime el valor que ingreso
> cout << "Desea ingresar otro numero? (s, n) ";
> cin >> respuesta;
> cout << "Otra vez el ultimo valor ingresado: " << ultimoNodo->valor <<
> endl; //imprime la direccion de memoria.
>
> Como veran en el comentario el primer cout muesta el valor correcto
> pero el segundo muestra otro valor, a pesar de que la instruccion es
> exactamente la misma.
>
> Adjunto el codigo fuente completo por si lo quieren analizar.
>
> Seria excelente si alguien me pudiera ayudar a resolver este curioso
> fenomeno :)
>
> de ante mano muchas gracias.
>

El error está en el uso del puntero 'ultimoNodo' en la función 'push()'. 
Escribes:

void push( int nuevoValor )
{
   Nodo nuevoNodo = Nodo();  // No es necesario escribir: = Nodo()
   nuevoNodo.valor = nuevoValor;

   if( isEmpthy() )
     nuevoNodo.anterior = NULL;
   else
     nuevoNodo.anterior = ultimoNodo;

   ultimoNodo = &nuevoNodo;  // Error lógico
}

La variable 'nuevoNodo' existe localmente. Esto significa que se creará 
automáticamente al invocar esta función 'push()' y se destruirá 
automáticamente al terminar esta función y retornar a su punto de 
invocación.

Esto implica que 'ultimoNodo' apunta a "basura". Has tenido suerte que 
tu programa haya podido ejecutar sin problemas, aunque has descubierto 
que hay un problema con el valor accedido. Típicamente, un puntero que 
apunta a basura termina por acceder a memoria que no es suya y provoca 
un error en tiempo de ejecución con un mensaje al estilo de "violación 
de segmentación" o "acceso denegado".

Lo que estás intentando hacer es crear una lista enlazada, pero 
necesitas que sea dinámicamente enlazada. Esto significa que necesitas 
usar memoria dinámica. Puedes consultar nuestro curso de EDD en nuestra 
página. Puedes ir directamente a: http://c.conclase.net/edd/index.php


Espero que esto te aclare la duda.

Steven





Más información sobre la lista de distribución Cconclase