Explicación. |
Código
fuente, en negrita la instrucción que se ejecuta. |
Estado de la
memoria del programa. |
||||||||||||||||||||||||||||||||||||||||||
Inicio del programa. El sistema operativo reserva memoria para las
variables declaradas en el programa. Vamos a suponer que todas las variables ocupan una casilla de la
memoria. Recordar que el valor que tienen esas variables no está definido. |
Program (INPUT, OUTPUT); Var A : INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Obtenemos la
dirección de la variable A. |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Le asignamos a |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Hacemos que la
dirección apuntada por pA tome el valor 200. |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Asignamos a la
variable pB el valor de la variable pA. |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Le asignamos a la
variable pB el valor 5. Esto no se debe
hacer NUNCA, lo que hacemos es que la variable pB
apunte a la posición 5 de memoria. No sabemos lo que hay en esa posición o si
está siendo usada por otro programa. Los resultados de esta práctica son
impredecibles. Puede que el sistema operativo detecte un acceso a una zona de
memoria no válida, pero en el peor de los casos dos programas pueden estar
utilizando (Y CAMBIANDO) la misma zona de memoria. |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Le pedimos al
sistema operativo que nos reserve una porción de memoria para almacenar un
INTEGER (ya que pB es un puntero a este tipo de
datos). Al igual que al
iniciar un programa, el contenido de esa memoria no ha sido inicializado.
Nuestro programa no deberá utilizar ese valor hasta haber sido inicializado. |
Program
(INPUT, OUTPUT); Var A : INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Hacemos que la
dirección apuntada por pB tome el valor 900. |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Liberamos la
memoria de pB. El valor de pB
no tiene porque cambiar, y puede seguir apuntando a la misma zona de memoria. |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Acceder a una zona
de memoria que no nos pertenece. Esto no se debe
hacer NUNCA. Puede desde no pasar nada, que el sistema operativo lo detecte
como una operación inválida o que se modifique un valor en otro programa que
está en ejecución. |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|
||||||||||||||||||||||||||||||||||||||||||
Asignar a pB el valor de puntero nulo. De esta manera evitaremos
acceder accidentalmente a zonas de memoria que no nos pertenece. |
Program
(INPUT, OUTPUT); Var A :
INTEGER; pA, pB : ^INTEGER; Begin pA := @A; A := 100; pA^:= 200; pB := pA; pB := 5; new(pB); pB^:= 900; dispose(pB); pB^:=800; pB := nil; End; |
|