ProgramaciónDesarrollador C

Explique la diferencia entre la pila y el montón en el lenguaje C y cuándo es mejor usar uno u otro tipo de memoria?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

En el lenguaje C, la memoria para las variables se puede asignar en pila (stack) o en montón (heap).

  • Pila — asigna memoria automáticamente al entrar en una función y la libera al salir. Rápido, pero el volumen de memoria está limitado por el tamaño de la pila (generalmente varios MB).
  • Montón — asigna memoria dinámicamente a través de malloc, calloc, realloc, y se libera manualmente a través de free. El volumen de memoria está limitado por las capacidades del sistema, pero el acceso es más lento y la liberación se controla manualmente.

Cuándo usar la pila:

  • Para variables locales, si su tamaño es pequeño y conocido en el momento de la compilación.
  • Para argumentos de funciones y pequeños arreglos.

Cuándo usar el montón:

  • Cuando el tamaño de la memoria no es conocido por adelantado.
  • Para objetos grandes o de larga duración.

Ejemplo de código:

// En la pila int arr[10]; // En el montón int* parr = malloc(sizeof(int) * 10); // No olvides liberar la memoria free(parr);

Pregunta trampa.

Pregunta: ¿Qué pasará si no se llama a la función free para un arreglo asignado a través de malloc?

Respuesta: Ocurrirá una fuga de memoria (memory leak). La memoria asignada dinámicamente no se liberará automáticamente, y con el tiempo esto puede llevar al agotamiento de la memoria de la aplicación o del sistema entero.

Ejemplo de código:

void leak() { int* leakArr = malloc(100 * sizeof(int)); // No hay llamada a free(leakArr), la memoria se pierde }

Historia

En un proyecto, los programadores asignaron memoria para una estructura que describe la sesión del usuario a través de malloc, pero olvidaron llamar a free al terminar de trabajar con la sesión. Como resultado, el proyecto perdía memoria durante varios días, y el servidor "caía" con un error de falta de memoria. El problema se solucionó solo después de perfilar con Valgrind y corregir todos los free omitidos.


Historia

Un desarrollador asignaba un gran arreglo (hasta 10 MB) en la pila para cálculos temporales. En un servidor con un tamaño de pila pequeño, esto llevaba a que la aplicación se cayera con un error de desbordamiento de pila. Después de analizar, se tuvo que mover el buffer al montón.


Historia

Uno de los desarrolladores decidió almacenar cadenas largas en la pila, pero el tamaño de la cadena era subjetivamente especificado por el usuario. Al introducir una cadena muy larga, la aplicación fallaba con un error de acceso a memoria. Finalmente, se decidió mover los datos ingresados al montón con una verificación de longitud.