Diferencia de puntero de stack para puntero de char y matriz

Tengo una matriz de caracteres como a continuación:

  char buffer[100] 

Y otro puntero de char como abajo:

  char *buffer buffer = malloc(100) 

Cuando uso GDB para ver el puntero de la stack, en realidad son diferentes. ¿Por qué?

Esto se debe a que el char buffer[100] se asignará a la stack, que ocupará 100 bytes de almacenamiento. Por lo tanto, el puntero de stack esp / rsp apuntará a una memoria inferior (al astackr la stack crece hacia abajo)

  +- +------------+ <-- ebp | | | b +------------+ u | | f +------------+ f | | holds 100 elements of buffer array e +------------+ r . . a . r +------------+ r | | +- +------------+ <-- esp 

Y en el caso de char *buffer solo se asignará una memoria de objeto de tipo char * ( sizeof (char *) ) en la stack. Cuando haga buffer = malloc (100) , se devolverá la dirección base de un bloque de memoria con 100 bytes garantizados. Esta memoria asignada generalmente se toma del montón. Por lo tanto, ahora el buffer contiene la dirección base del bloque de memoria asignado. Entonces, en este caso porque la memoria es del montón, y la stack solo contiene el objeto de tipo char * , por lo tanto, el puntero de stack está en una ubicación más alta (tomando la stack crecida hacia abajo)

  +------------+ <-- ebp | 0xabcd | buffer , char * type +-----+------+ <-- esp | | | 0xabcd 0xabce | +-----+-----+-----+ +-----+-----+ +------------>| | | | . . . | | | +-----+-----+-----+ +-----+-----+ 0xabcf . . . | | +------ 100 bytes mem block in heap --+ 

También tenga en cuenta el comentario de Richard J. Ross III.