Hay dos lugares donde las variables se pueden poner en la memoria. Cuando se crea una variable de la siguiente manera:
int a;
char c;
char d[16];
Las variables se crean en la "pila ". Las variables de pila se liberan automáticamente cuando salen del alcance (es decir, cuando el código ya no puede alcanzarlas). Es posible que los escuche denominados variables "automáticas", pero eso ha pasado de moda.
Muchos ejemplos para principiantes usarán solo variables de pila.
La pila es agradable porque es automática, pero también tiene dos inconvenientes: (1) El compilador necesita saber de antemano qué tan grandes son las variables, y (b) el espacio de la pila es algo limitado. Por ejemplo: en Windows, bajo la configuración predeterminada para el enlazador de Microsoft, la pila está configurada en 1 MB, y no todo está disponible para sus variables.
Si no sabe en tiempo de compilación qué tan grande es su matriz, o si necesita una gran matriz o estructura, necesita el "plan B".
Plan B se denomina "montón". Por lo general, puede crear variables tan grandes como le permita el sistema operativo, pero debe hacerlo usted mismo. publicaciones anteriores que mostraron una forma que puede hacerlo, aunque hay otras maneras:
int size;
// ...
// Set size to some value, based on information available at run-time. Then:
// ...
char *p = (char *)malloc(size);
(Tenga en cuenta que las variables en el montón no son manipulados directamente, sino a través de punteros)
Una vez que crean una variable del montón , el problema es que el compilador no puede decir cuándo terminaste con él, por lo que pierdes la liberación automática. Ahí es donde entra en juego la "liberación manual" a la que se refería. Su código ahora es responsable de decidir cuándo ya no se necesita la variable y liberarla para que la memoria pueda tomarse para otros fines.Para el caso anterior, con:
free(p);
Lo que hace que esta segunda opción "negocio sucio" es que no siempre es fácil saber cuando la variable no se necesita más. Olvidarse de lanzar una variable cuando no la necesite hará que su programa consuma más memoria que la necesita. Esta situación se llama "fuga". La memoria "filtrada" no puede utilizarse para nada hasta que el programa finalice y el sistema operativo recupere todos sus recursos. Incluso problemas más desagradables son posibles si libera una variable de montón por error antes de que realmente ha terminado con ella.
En C y C++, usted es responsable de limpiar las variables del montón como se muestra arriba. Sin embargo, hay idiomas y entornos como Java y lenguajes .NET como C# que usan un enfoque diferente, donde el montón se limpia por sí mismo. Este segundo método, llamado "recolección de basura", es mucho más fácil para el desarrollador, pero usted paga una multa por gastos generales y rendimiento. Es un equilibrio.
(I han pasado por alto muchos detalles para dar un simple, pero es de esperar respuesta más nivelado)
Un buen lugar para aprender [G4G] (http://www.geeksforgeeks.org/memory-layout-of-c-program/) – EsmaeelE