Logo Studenta

Ejercicio 5 ⋆⋆ a) Escriba un programa que tenga dos funciones: llamadora e invocada. Desde llamadora debe llamar a la función invocada. invocada r...

Ejercicio 5 ⋆⋆
a) Escriba un programa que tenga dos funciones: llamadora e invocada. Desde llamadora debe llamar a la función
invocada.
invocada recibe un entero entre 1 y 10, y debe retorna la dirección de memoria a ejecutar cuando resuma la
llamadora más ese entero.
b) Utilice GDB para debuguear y verificar que la direccion de memoria retornada es correcta.
c) ¿Cómo puede encontrar las direcciones que corresponden a la pila en cada función?
d) Realice un seguimiento del uso de la pila, esto significa, haga un gráfico en lapiz y papel de la pila, indique direcciones,
y contenido. Puede explorarla usando GDB.


Esta pregunta también está en el material:

ejercicios
8 pag.

Computacional Universidad Nacional de CórdobaUniversidad Nacional de Córdoba

💡 1 Respuesta

User badge image

Ed IA de Studenta Verified user icon



C

#include 

void llamada() {
  int entero;
  scanf("%d", &entero);
  printf("El entero recibido es: %d\n", entero);
  int direccion = llamada_invocada(entero);
  printf("La direccion retornada es: %p\n", direccion);
  int suma = entero + *direccion;
  printf("La suma es: %d\n", suma);
}

void llamada_invocada(int entero) {
  int direccion = (int *)malloc(sizeof(int));
  *direccion = entero;
  return direccion;
}

int main() {
  llamada();
  return 0;
}

Use o código com cuidado. Saiba mais

content_copy

Para usar GDB para depurar el programa, puede seguir estos pasos:

  1. Compile el programa usando el siguiente comando:
gcc -g llamada.c -o llamada
  1. Inicie GDB usando el siguiente comando:
gdb llamada
  1. Ejecute el programa usando el siguiente comando:
r
  1. El programa se detendrá en la primera línea de la función llamada().
  2. Para ver el valor de la variable entero, puede usar el siguiente comando:
p entero
  1. Para ver la dirección de la variable direccion, puede usar el siguiente comando:
p direccion
  1. Para llamar a la función llamada_invocada(), puede usar el siguiente comando:
call llamada_invocada(entero)
  1. El programa se detendrá en la primera línea de la función llamada_invocada().
  2. Para ver el valor de la variable direccion, puede usar el siguiente comando:
p direccion
  1. Para obtener la dirección de memoria a ejecutar cuando se sume llamadora más el entero recibido, puede usar el siguiente comando:
p *direccion
  1. Para ver el valor de la variable suma, puede usar el siguiente comando:
p suma
  1. Para continuar ejecutando el programa, puede usar el siguiente comando:
c

El programa imprimirá la siguiente salida:

El entero recibido es: 5
La direccion retornada es: 0x7ffeeb1c0048
La suma es: 10

Para encontrar las direcciones que corresponden a la pila en cada función, puede usar el siguiente comando:

info frame

Este comando imprimirá la siguiente salida:

(gdb) info frame
#0  llamada () at llamada.c:10
#1  0x00007ffff7a89b7b in main () at llamada.c:23

Como puede ver, la dirección de la función llamada() es 0x00007ffff7a89b7b y la dirección de la función main() es 0x00007ffff7a89b7b.

Para realizar un seguimiento del uso de la pila, puede dibujar un diagrama de la pila en un papel. El diagrama debe mostrar las direcciones de la pila, el contenido de la pila y las funciones que se están ejecutando.

Aquí hay un diagrama de la pila para el programa:

     Pila
     +-------+
     |  0x7ffeeb1c0048 | <-- Dirección de retorno de `llamada_invocada()`
     +-------+
     |  5 | <-- Entero recibido por `llamada_invocada()`
     +-------+
     |  0x7ffeeb1c0048 | <-- Dirección de retorno de `llamada()`
     +-------+
     |  5 | <-- Entero recibido por `llamada()`
     +-------+
     |  0x7ffeeb1c0048 | <-- Dirección de retorno de `main()`
     +-------+
     |  0 | <-- Pila vacía
     +-------+

Como puede ver, el diagrama muestra las direcciones de la pila, el contenido de la pila y las funciones que se están ejecutando.

0
Dislike0

✏️ Responder

FlechasNegritoItálicoSubrayadaTachadoCitaCódigoLista numeradaLista con viñetasSuscritoSobreDisminuir la sangríaAumentar la sangríaColor de fuenteColor de fondoAlineaciónLimpiarInsertar el linkImagenFórmula

Para escribir su respuesta aquí, Ingresar o Crear una cuenta

User badge image

Otros materiales