Papel y casa

Punteros en C dibujados con las direcciones reales que sacaste con gdb de build/hello. En cada pantalla, primero predices y luego miras.

papel: un puntero, 8 bytes con una dirección pila: variables locales montón: lo que sale de malloc/realloc

Dónde vive cada cosa

El momento: el punto de parada en la línea 42 de hello.c. buffer tiene 100 bytes 'A' y buffer_a tiene un 0x1B. Contesta las preguntas y el mapa se irá rellenando.

Pila · [stack]0x7fff…
buffer
0x4052b0
en 0x7fffffffd520 · 8 B
0x20 = 32 bytes
buffer_a
0x405360
en 0x7fffffffd540 · 8 B
entre las dos zonas hay unos 128 TB de direcciones sin usar
Montón · [heap]0x40…
*buffer0x4052b0 · 24 B
data · +00x4052d0
len · +8100
cap · +16128
bloque de buffer0x4052d0 · 128 B
100 usados · 28 libres
*buffer_a0x405360 · 24 B
data · +00x405380
len · +81
cap · +1664
bloque de buffer_a0x405380 · 64 B
1 usado · 63 libres

Las cajas con ? aparecen cuando contestes.

En Go

b := &Buffer{} también puede dejar el papel en la pila y la casa en el montón. La diferencia es que lo decide el compilador (escape analysis) y tú no lo ves. En C lo decides tú: si lo pides con malloc, va al montón.