Lenguajes de Programación I
Ej. 1 – Parcial 2024
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:
Variables estáticas
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]
}
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
Variables semi-dinámicas
Variables dinámicas
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
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?
o
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
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
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)
}
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.
d) Indicar las variables donde su alcance exceda el tiempo de vida.
e) Indicar las variables que se convierten en garbage.
Errores frecuentes