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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

 

3

 

 

4

 

 

5

 

 

6

 

A

7

###

pA

8

###

pB

9

###

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

 

3

 

 

4

 

 

5

 

 

6

 

A

7

###

pA

8

7

pB

9

###

 

10

 

 

11

 

 

12

 

Le asignamos a la variable A el valor 100.

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

 

3

 

 

4

 

 

5

 

 

6

 

A

7

100

pA

8

7

pB

9

###

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

 

3

 

 

4

 

 

5

 

 

6

 

A

7

200

pA

8

7

pB

9

###

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

 

3

 

 

4

 

 

5

 

 

6

 

A

7

200

pA

8

7

pB

9

7

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

 

3

 

 

4

 

 

5

 

 

6

 

A

7

200

pA

8

7

pB

9

5

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

reservado

3

###

 

4

 

 

5

 

 

6

 

A

7

200

pA

8

7

pB

9

3

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

reservado

3

900

 

4

 

 

5

 

 

6

 

A

7

200

pA

8

7

pB

9

3

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

libre

3

900

 

4

 

 

5

 

 

6

 

A

7

200

pA

8

7

pB

9

3

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

libre

3

900

 

4

 

 

5

 

 

6

 

A

7

200

pA

8

7

pB

9

3

 

10

 

 

11

 

 

12

 

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;

 

variable

Direccion

Contenido

 

0

 

 

1

 

 

2

 

 

3

900

 

4

 

 

5

 

 

6

 

A

7

200

pA

8

7

pB

9

nil

 

10

 

 

11

 

 

12