1 of 9

Lenguajes de Programación I

Ej. 1 – Parcial 2024

2 of 9

Código

int x1=3

int *x7

int a0[5]

void f(int z1) {

static int *x4 = &x1

int a1[z1]

int a5[x1]

int a2[4]

int *x5 = (int*) malloc(int)

int **x6 = (int**) malloc(*int)

*x6 = x5

x7 = x5

a1 = a2

x1=6

print size(a1) // imprime 4

print size(a5) // imprime 6

}

int h() {

static int a3[10]

x7 = &a3[2]

}

void g(int z2) {

int a4[x1]

x1 = 10

print size(a4) // imprime 6

h()

}

void main() {

int x2 = 7

int *x3 = &x2

f(x2)

g(5)

}

Dado el siguiente código en un lenguaje con pasaje de parámetros por copia valor y asignaciones entre arreglos por valor:

  1. Construir la pila de ejecución que muestre la ubicación y los valores de todas las variables del programa (para las direcciones utilizar valores arbitrarios entre $10 y $90 para las variables eśtaticas, entre $100 y $900 para las variables ubicadas en la pila y mayores a $1000 para las ubicadas en el heap).
  2. Para cada una de las variables existentes en el código, indicar el almacenamiento según sea Estática, Semi-estática, Semi-dinámica, Dinámica anónima o Dinámica con nombre.
  3. Indicar las variables donde su tiempo de vida exceda el alcance.
  4. Indicar las variables donde su alcance exceda el tiempo de vida.
  5. Indicar las variables que se convierten en garbage.

3 of 9

  • Construir la pila de ejecución que muestre la ubicación y los valores de todas las variables del programa (para las direcciones utilizar valores arbitrarios entre $10 y $90 para las variables eśtaticas, entre $100 y $900 para las variables ubicadas en la pila y mayores a $1000 para las ubicadas en el heap).

Variables estáticas

  • Deben tener un tamaño fijo durante todo el programa.
  • Deben estar en una ubicación fija durante todo el programa.

Todas las variables globales

Todas las variables declaradas con un modificador de almacenamiento “static”

Var. Estáticas

x1

$10

3

x7

$14

a0

$18

x4

$34

a3

$38

void g(int z2) {

int a4[x1]

x1 = 10

print size(a4) // imprime 6

h()

}

void main() {

int x2 = 7

int *x3 = &x2

f(x2)

g(5)

}

int x1=3

int *x7

int a0[5]

void f(int z1) {

static int *x4 = &x1

int a1[z1]

int a5[x1]

int a2[4]

int *x5 = (int*) malloc(int)

int **x6 = (int**) malloc(*int)

*x6 = x5

x7 = x5

a1 = a2

x1=6

print size(a1) // imprime 4

print size(a5) // imprime 6

}

int h() {

static int a3[10]

x7 = &a3[2]

}

4 of 9

Var. Estáticas

x1

$10

3

x7

$14

a0

$18

x4

$34

a3

$38

R.A. Main

x2

$100

int x1=3; int *x7; int a0[5]

void f(int z1) {

static int *x4 = &x1

int a1[z1]; int a5[x1]; int a2[4]

int *x5 = (int*) malloc(int)

int **x6 = (int**) malloc(*int)

*x6 = x5

x7 = x5

a1 = a2

x1=6

print size(a1) // imprime 4

print size(a5) // imprime 6 }

int h() {

static int a3[10]

x7 = &a3[2] }

void g(int z2) {

int a4[x1]

x1 = 10

print size(a4) // imprime 6

h() }

void main() {

int x2 = 7

int *x3 = &x2

f(x2)

g(5) }

x3

$104

R.A. f

a2

$204

$100

7

x5

$220

x6

$224

z1

$200

7

$3000

Variables semi-estáticas

  • Pueden tener una ubicación absoluta diferente en cada ejecución de la función.
  • Tienen el mismo tamaño durante todo el programa

Variables semi-dinámicas

  • Tienen un tamaño variable
  • No pueden cambiar de tamaño durante la función
  • Pueden cambiar de tamaño entre ejecuciones diferentes de la función

Variables dinámicas

  • Pueden cambiar de tamaño en cualquier momento

PUEDEN UBICARSE EN EL REGISTRO DE ACTIVACIÓN

PUEDEN UBICARSE EN EL REGISTRO DE ACTIVACIÓN

(Descriptor + Datos)

LOS DATOS DEBEN UBICARSE EN EL HEAP

¿En cuál categoría caen a1 y a5?

¿Hay más variables creadas en f()?

dos dinámicas anónimas

dinámicas con nombre

Con nombre

Anónimas

5 of 9

Var. Estáticas

x1

$10

3

x7

$14

a0

$18

x4

$34

a3

$38

R.A. Main

x2

$100

int x1=3; int *x7; int a0[5]

void f(int z1) {

static int *x4 = &x1

int a1[z1]; int a5[x1]; int a2[4]

int *x5 = (int*) malloc(int)

int **x6 = (int**) malloc(*int)

*x6 = x5

x7 = x5

a1 = a2

x1=6

print size(a1) // imprime 4

print size(a5) // imprime 6 }

int h() {

static int a3[10]

x7 = &a3[2] }

void g(int z2) {

int a4[x1]

x1 = 10

print size(a4) // imprime 6

h() }

void main() {

int x2 = 7

int *x3 = &x2

f(x2)

g(5) }

x3

$104

R.A. f

a2

$204

$100

7

x5

$220

x6

$224

z1

$200

7

$3000

$4000

$3000

int x2 = 7

int *x3 = &x2

¿Cómo se almacenan

a1 y a5?

  • Descriptor en la pila
  • Datos en el heap

o

  • Parte del Descriptor en la pila
  • Parte del descriptor en el heap y Datos en el Heap

a1

$228

0

6

$1000

a5

$240

0

2

$2000

Heap

$1000

$2000

$3000

$4000

$3000

$5000

No cambian de cantidad de dimensiones

¿Cómo se almacenan las dinámicas anónimas?

Datos en el heap

¿Por qué en la solución se pudieron poner los descriptores en la pila?

$5000

3

6

$9000

5

$9000

6 of 9

Var. Estáticas

x1

$10

3

x7

$14

a0

$18

x4

$34

a3

$38

R.A. Main

x2

$100

int x1=3; int *x7; int a0[5]

void f(int z1) {

static int *x4 = &x1

int a1[z1]; int a5[x1]; int a2[4]

int *x5 = (int*) malloc(int)

int **x6 = (int**) malloc(*int)

*x6 = x5

x7 = x5

a1 = a2

x1=6

print size(a1) // imprime 4

print size(a5) // imprime 6 }

int h() {

static int a3[10]

x7 = &a3[2] }

void g(int z2) {

int a4[x1]

x1 = 10

print size(a4) // imprime 6

h() }

void main() {

int x2 = 7

int *x3 = &x2

f(x2)

g(5) }

x3

$104

R.A. f

a2

$204

$100

7

x5

$220

x6

$224

z1

$200

7

$3000

$4000

$3000

a1

$228

0

6

$1000

a5

$240

0

2

$2000

Heap

$1000

$2000

$3000

$4000

$3000

$5000

$5000

3

6

$9000

5

$9000

R.A. g

z2

$300

5

¿qué tipo de variable es a4?

Tamaño variable pero no cambia de tamaño dentro del R.A -> Semi-dinámica

Descriptor a4

$304

$316

0

4

datos a4

$316

R.A. h

a4

7 of 9

b) Para cada una de las variables existentes en el código, indicar el almacenamiento según sea Estática, Semi-estática, Semi-dinámica, Dinámica anónima o Dinámica con nombre.

int x1=3; int *x7; int a0[5]

void f(int z1) {

static int *x4 = &x1

int a1[z1]; int a5[x1]; int a2[4]

int *x5 = (int*) malloc(int)

int **x6 = (int**) malloc(*int)

*x6 = x5

x7 = x5

a1 = a2

x1=6

print size(a1) // imprime 4

print size(a5) // imprime 6

}

int h() {

static int a3[10]

x7 = &a3[2]

}

Estáticas

Semi-estáticas

Semi-dinámicas

Dinámicas con nombre

Dinámicas anónimas

void g(int z2) {

int a4[x1]

x1 = 10

print size(a4) // imprime 6

h()

}

void main() {

int x2 = 7

int *x3 = &x2

f(x2)

g(5)

}

8 of 9

Código

int x1=3

int *x7

int a0[5]

void f(int z1) {

static int *x4 = &x1

int a1[z1]

int a5[x1]

int a2[4]

int *x5 = (int*) malloc(int)

int **x6 = (int**) malloc(*int)

*x6 = x5

x7 = x5

a1 = a2

x1=6

print size(a1) // imprime 4

print size(a5) // imprime 6

}

int h() {

static int a3[10]

x7 = &a3[2]

}

void g(int z2) {

int a4[x1]

x1 = 10

print size(a4) // imprime 6

h()

}

void main() {

int x2 = 7

int *x3 = &x2

f(x2)

g(5)

}

c) Indicar las variables donde su tiempo de vida exceda el alcance.

  • Las dos dinámicas anónimas
  • x4
  • a3

d) Indicar las variables donde su alcance exceda el tiempo de vida.

  • Ninguna

e) Indicar las variables que se convierten en garbage.

  • Las dos dinámicas anónimas

9 of 9

Errores frecuentes

  • Variables globales ubicadas en el R.A. del main
  • Variables static no globales ubicadas como semi-estáticas
  • Variables a1 y a5 clasificadas como semi-dinámicas
  • Variables x5 y x6 clasificadas como dinámicas
  • Variables *x5 y *x6 clasificadas como semidinámicas
  • Variable a4 clasificada como semi-estática
  • Variable a4 clasificada como dinámica
  • Variables a1 y a5 clasificadas como garbage