Próbuję zrozumieć, w jaki sposób C przydziela pamięć na stosie. Zawsze uważałem, że zmienne na stosie mogą być przedstawiane jak zmienne składowe struktury, zajmują kolejne, ciągłe bloki bajtów wewnątrz stosu. Aby pomóc zilustrować ten problem, znalazłem gdzieś, stworzyłem ten mały program, który powielał to zjawisko.Czy zmienne stosu C są przechowywane w odwrotnej kolejności?
#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);
}
Zobacz co robię? Załóżmy, że sizeof(int)
jest 4: szukam 4 bajtów za przekazanym wskaźnikiem, ponieważ odczytałoby to 4 bajty przed miejscem, w którym int y
w stosie dzwoniącego .
Nie wydrukować 152. Co dziwne, kiedy patrzę na najbliższe 4 bajty:
int *_prev_int = (int *) ((long unsigned int) i + sizeof(int)) ;
i teraz działa drukuje cokolwiek w x
wewnątrz stosu rozmówcy. Dlaczego x
ma niższy adres niż y
? Czy zmienne stosu są przechowywane do góry nogami?
stos jest przechowywany w dół – Ajit
Myślę, że jest to implementacja zdefiniowana/lub nieokreślona. Sprawdź tę odpowiedź http://stackoverflow.com/a/4105123/1673391 –
Jest to całkowicie zależne od platformy, ale wiele popularnych platform faktycznie zwiększa wysokość stosu z sekcji kodu/danych i stos w dół od góry (dostępny) pamięć. Powinieneś ** nigdy ** polegać na tym w twoim kodzie C, chociaż ... – DevSolar