Как выделяется память для статического массива в стеке?

Я начал глубокое изучение эксплойтов, работы с памятью и т.д. и столкнулся с той же проблемой. Везде написано, что память выделяется переменным в порядке их объявления внутри функции, но в моем случае это абсолютно не влияет на это, т.е. указатель на первый элемент массива в любом из вариантов остается в одном место. Вот пример: у меня есть код на 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 , и поместилимассив, который требует однобайтового выравнивания после них. Этот выбор места оставался неизменным независимо от порядка появления определений.

Сноска

1 Это не значит, что первое в хронологическом порядке. В этом случае компилятор, по-видимому, организует более строго выровненные объекты по более низким адресам, следовательно, сначала в порядке адресов, а не сначала в направлении роста стека. Можно сделать и другие варианты дизайна, например, разместить более строго выровненные объекты по более высоким адресам.

Другие вопросы по тегам