1. En la memoria 'stack' yo tendria inicialmente a la funcion main con todas su variables y en la memoria global tendria al puntero.
En tú caso no se bien si tendrías algo en la pila porque
main() lo declaras sin parámetros y el puntero está sin inicializar.
2. Entra a la funcion 'h()' por lo cual en la memoria 'stack' se ve almacenada la informacion de la funcion y con ella la variable 'a'.( El proyecto dentro de una empresa empieza y me asigna una oficina ).
Así es, en la pila los primeros elementos serían los conformados por el valor del entero, 333. Eso dependería del sistema, los bytes que ocupe en la pila, pero con un
usigned char se vería más claro (1 byte).
3. El puntero apunta a la dirección de memoria que tiene la variable 'a' . ( Tengo una llave que me ayuda a abrir la oficina ).
Si, en ese momento se toma la referencia del primer elemento de la pila
a.
Para probar ésto simplemente declara la variable pero no la inicialices y luego imprime su valor. Ejemplo:
#include <iostream>
char * p;
void fu() {
char a;
printf("a = %c", a); // Esta accion algunos compiladores no te lo permiten, ya que esta sin inicializar.
a = 'A';
p = &a;
}
int main()
{
fu();
printf("%c puntero %p\n",(*p), p);
(*p) = 'F';
fu(); // Verás que el valor de "a", aun sin inicializar ahora te da "F"...
printf("%c puntero %p\n", (*p), p); // y sigue apuntando al mismo elemento.
return 0;
}
4. Termina la función 'h()' y por lo tanto se regresa a la funcion main con lo cual para el programa tanto las variables 'a' como el segmento de memoria que ella ocupaba ya no esta ocupado aun que yo tenga un puntero global apuntado anteriormente a ella ( El proyecto finaliza pero se me permite seguir conservando la llave ).
Ojo, que la pila sigue ahí, ya que fue reservada al inicio del programa. La pila sólo es liberada al finalizar el programa.
5. Finalmente se puede dar que con el puntero final yo pueda seguir accediendo a ese segmento de memoria y succeda algo de lo siguiente:
-El segmento de memoria sigue conservando el valor que yo asigne a la variable 'a'.
-El segmento de memoria contenga valores que el compilador asigno cuando se salio de la funcion para representar que esta vacio.
-Que yo pueda seguir viendo el mismo valor de 'a' por gran parte del programa pero que pueda que tenga la mala suerte que ese segmento de memoria llegue a ser ocupado por el valor de una nueva variable y que al yo seguir haciendo referencia con el puntero global no me puedo fiar en que ese segmento de memoria siga conteniendo el valor de 'a' que se le asigno inicialmente.
Mientras no finalice el programa tú puntero conserva la referencia al primer elemento de la pila (ver ejemplo del tercer punto).
Finalmente entonces para asegurar que el puntero global pueda seguir conservando el valor 'a' sin problemas deberia hacer uso de una reservacion de memoria de manera dinamica con ayuda de new o malloc y asignarle el valor de la variable 'a'.
No, puedes conservar el puntero, no hay problema, pero cuando trabajas con punteros y quieres reservar memoria al usar
new,
alloc o lo que sea... el sistema te reserva memoria en otro segmento, no en el segmento de la pila. El segmento que te dan al reservar memoria dinámica es el que muestra en el vídeo como
Heap o
Monto. Trabajar con memoria dinámica o con la pila tiene sus ventajas y desventajas, por ejemplo con pila la gestión es más rápida pero en contra tienes que suele estar limitada a un tamaño pequeño, por ejemplo un mega o algo así (depende). La memoria dinámica siempre debes liberarla cuando no la uses porque podrías quedarte sin memoria.