Differenza del puntatore dello stack per il puntatore char e l’array

Ho un array di char come di seguito:

  char buffer[100] 

E un altro puntatore char come di seguito:

  char *buffer buffer = malloc(100) 

Quando uso GDB per controllare il puntatore dello stack, in realtà sono diversi. Perché?

Questo perché il char buffer[100] sarà allocato nello stack, che occuperà 100 byte di spazio. Pertanto, il puntatore dello stack esp / rsp punta a una memoria più bassa (lo stack crescente cresce verso il basso)

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

E nel caso di char *buffer solo una memoria di tipo char * type ( sizeof (char *) ) verrà allocata nello stack. Quando si esegue il buffer = malloc (100) verrà restituito l'indirizzo di base di un blocco di memoria con 100 byte garantiti. Questa memoria allocata viene generalmente prelevata dall'heap. Pertanto ora il buffer contiene l'indirizzo di base del blocco di memoria appena assegnato. Quindi, in questo caso perché la memoria proviene dall'heap e lo stack contiene solo l'object di tipo char * , quindi il puntatore dello stack si trova in una posizione più alta (prendendo stack rivolto verso il basso)

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

Nota anche il commento di Richard J. Ross III.