Pascal/Turbo Pascal - Mi Turbo Pascal se ha rebelado

 
Vista:

Mi Turbo Pascal se ha rebelado

Publicado por Roberto Garcia Garcia (41 intervenciones) el 15/04/2005 05:16:56
Hola, no se si es que realmente ya se me olvido todo eso de los punteros o es que mi Compilador (que no creo) se haya vuelto loco.

Se supone que la siguiente instruccion

aux : = nil ;

No destruye los datos de la celda de memoria a donde apunta aux, solo hace que aux no apunte a ninguna celda de memoria.

Por lo tanto

L : = aux ;
aux : = nil ;

deja los datos disponibles para L, pero ya no pueden acceder con aux
y has ahi todo bien

pero si yo hago esto

new ( aux);
aux ^. dato : = 'a' ;
aux ^. sig : = Nil ;
L : = aux;
dipose ( aux );

Se supone que los datos de la celda de memoria se destruyen y ya no es posible acceder a ellos ni por L ni por Aux, pero veo con asombro que si puedo hacer referencia tanto a L como a aux que es lo mas sorprendente, despues del dispose yo puedo hacer esto

write ( L ^.dato ) ;
write (aux ^ . dato ) ;

Y me esperaba un error, pero resulta que si escribe los datos que "tenian", si alguien podria hacerme favor de explicarme que pasa aqui el programa que hice para esta prueba, si no cabe aqui, lo pongo en otro mensaje

Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Aqui esta el programa

Publicado por Roberto Garcia Garcia (41 intervenciones) el 15/04/2005 05:18:42
program prueba_punteros;
uses crt;

type
puntero=^nodo;

nodo=record
dato:char;
sig:puntero;
end;

var
aux,L:puntero;

begin
clrscr;

L:=nil;

new(aux);
aux^.dato:='a';
aux^.sig:=nil;

L:=aux;

writeln('Valor de : ',L^.dato);
readkey;

dispose(aux);
dispose(L);


writeln('Valor de L despues de dispose(aux): ',L^.dato);
readkey;

writeln('Valor de aux: ',aux^.dato);
readkey;

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Aqui esta el programa

Publicado por M@rceloL (152 intervenciones) el 16/04/2005 03:49:53
La cosa es así:

Dispose libera la memoria, pero no pone en nil el puntero.

Ahora, con un puntero vos podés acceder a cualquier parte de memoria, asignada o no. Claro que puede que te dé un error de protección...

Pero en principio, uno podría cargar un puntero "a mano" con una dirección cualquiera y después acceder a esa posición...

GUARDA con dispose, porque uno tiende a creer que pone la variable en nil, pero no, así pasa que cuando uno recorre una lista o algo, suelen tildarse las cosas por el maldito puntero...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Aqui esta el programa

Publicado por Roberto Garcia Garcia (41 intervenciones) el 16/04/2005 08:49:33
Bueno, pero si Dispose(puntero) libera la memoria, me imagino que es la memoria a la cual se refiere el puntero, entonces porque es valido hacer un write(puntero), eso deberia marcar un error de "operacion no valida para puntero" o algo parecido no?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar