Как выделяется память для статического массива в стеке?
Я начал глубокое изучение эксплойтов, работы с памятью и т.д. и столкнулся с той же проблемой. Везде написано, что память выделяется переменным в порядке их объявления внутри функции, но в моем случае это абсолютно не влияет на это, т.е. указатель на первый элемент массива в любом из вариантов остается в одном место. Вот пример: у меня есть код на C.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myFunction() {
char x[20];
int a =1;
int b= 2;
int c = 3;
int d = 4;
}
int main(int argc, char *argv[]) {
myFunction();
}
Я компилирую его, отлаживаю и вывожу значение адреса массива x:введите сюда описание изображения. Затем я редактирую код и объявляю массив после инициализации переменной d:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myFunction() {
int a =1;`your text`
int b= 2;
int c = 3;
int d = 4;
char x[20];
}
int main(int argc, char *argv[]) {
myFunction();
}
И делаю те же операции, что и в предыдущем случае:ввожу сюда описание изображения
Как видите, положение массива в стеке никак не изменилось, не могли бы вы мне объяснить, почему это происходит?
1 ответ
Как выделяется память для статического массива в стеке?
Ни один из объектов, определенных в вашей программе, не является статичным. Все они имеют автоматическую продолжительность хранения, а не статическую. Статические объекты не хранятся в стеке.
Везде написано, что память выделяется переменным в порядке их объявления внутри функции,…
Об этом не везде пишут, да и вообще это неправда. Любой источник, который говорит, что это неверно. Это может быть частично верно в некоторых ограниченных обстоятельствах, таких как компиляция без оптимизации, но в целом это не так.
Как видите, положение массива в стеке никак не изменилось, не могли бы вы мне объяснить, почему это происходит?
Компиляторы обычно группируют объекты по требованиям к выравниванию (помимо других факторов), чтобы уменьшить общий объем необходимого для них пространства. В этом случае компилятор поместил все
Сноска
1 Это не значит, что первое в хронологическом порядке. В этом случае компилятор, по-видимому, организует более строго выровненные объекты по более низким адресам, следовательно, сначала в порядке адресов, а не сначала в направлении роста стека. Можно сделать и другие варианты дизайна, например, разместить более строго выровненные объекты по более высоким адресам.