Я использую этот код C
#define STACKSIZE 65536
char d[STACKSIZE];
if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) {
Printf ("Stack space reservation failed\n");
Exit ();
}
printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d));
auto int a = 3;
printf("Now the stack pointer is on %d\n",&a);
И я получаю в качестве вывода
Выделено от -4262832 до -4197296, поэтому для 65536 байтов
Теперь указатель стека включен -4262836
Это означает, что переменная «a» помещается в стек ПОСЛЕ массива.
Но если я использую массив переменной длины (массив, длина которого устанавливается во время выполнения), я получаю противоположное поведение: a помещается в стек ДО массива.
Это код (тот же, но размер массива устанавливается во время выполнения)
#define STACKSIZE 65536
int i = 1;
char d[i*STACKSIZE];
if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) {
Printf ("Stack space reservation failed\n");
Exit ();
}
printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d));
auto int a = 3;
printf("Now the stack pointer is on %d\n",&a);
Это вывод
Выделено от -4262856 до -4197320, поэтому для 65536 байтов
Теперь указатель стека включен -4197312
Так в чем же проблема? Как я могу решить это (используя массив переменной длины и помещая переменные в стек после него).
Спасибо!