Sto cercando di capire come C alloca la memoria sullo stack. Ho sempre pensato che le variabili sullo stack potessero essere rappresentate come le variabili dei membri delle strutture, occupano blocchi di byte successivi e contigui all'interno dello stack. Per aiutare a illustrare questo problema che ho trovato da qualche parte, ho creato questo piccolo programma che riproduceva il fenomeno.Le variabili di stack C sono memorizzate al contrario?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void function(int *i) {
int *_prev_int = (int *) ((long unsigned int) i - sizeof(int)) ;
printf("%d\n", *_prev_int);
}
void main(void)
{
int x = 152;
int y = 234;
function(&y);
}
Vedi cosa sto facendo? Supponiamo che sizeof(int)
sia 4: sto osservando 4 byte dietro il puntatore passato, in quanto questo leggerà i 4 byte prima di dove int y
nello stack del chiamante .
Non è stato stampato il 152. Stranamente quando guardo i prossimi 4 byte:
int *_prev_int = (int *) ((long unsigned int) i + sizeof(int)) ;
e ora funziona, stampe qualunque in x
all'interno dello stack del chiamante. Perché x
ha un indirizzo inferiore a ? Le variabili stack sono memorizzate al contrario?
stack è memorizzato verso il basso – Ajit
Penso che sia l'implementazione definito/o non specificato. Controlla questa risposta http://stackoverflow.com/a/4105123/1673391 –
Questo è completamente dipendente dalla piattaforma, ma molte piattaforme mainstream in realtà aumentano l'accumulo dalla sezione codice/dati e lo stack verso il basso dalla parte superiore di (disponibile) memoria. Dovresti ** non fare mai ** affidamento su quello nel tuo codice C, anche se ... – DevSolar