Объявление памяти в стеке перезаписывает ранее объявленную память - PullRequest
1 голос
/ 24 марта 2019

Как я могу выделить память в стеке и сделать так, чтобы она указывала на разные адреса памяти, чтобы я мог использовать ее позже? Например. этот код:

for (int i = 0; i < 5; i++) {
    int nums[5];
    nums[0] = 1;
    printf("%p\n", &nums[0]);
}

Будет распечатывать один и тот же адрес каждый раз. Как я могу записать память в стек (не в кучу, не в malloc) и не перезаписать что-то еще, уже находящееся в стеке.

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Вы можете использовать alloca для выделения другого массива из стека времени выполнения для каждой итерации в цикле.Содержимое массива будет оставаться действительным до тех пор, пока вы не выйдете из функции:

#include <stdlib.h>
#include <stdio.h>

void function() {

    for (int i = 0; i < 5; i++) {
        int *nums = alloca(5 * sizeof(*nums));
        nums[0] = 1;
        printf("%p\n", (void *)nums);
        /* store the value of `num` so the array can be used elsewhere.
         * the arrays must only be used before `function` returns to its caller.
         */
        ...
    }
    /* no need to free the arrays */
}

Обратите внимание, однако, что alloca() не является частью стандарта C и может быть недоступно на всех архитектурах.Существуют дополнительные ограничения на то, как его можно использовать, см. Документацию для вашей системы.

0 голосов
/ 24 марта 2019

Полагаю, вы ищете:

способ управления распределением памяти в стеке, по крайней мере, в контексте не перезаписи уже использованной памяти

Конечно, об этом позаботится ОС!Системные вызовы низкого уровня гарантируют, что вновь созданная автоматическая переменная не будет записана в уже используемый блок памяти.

В вашем примере:

for (int i = 0; i < 5; i++) {
  int nums[5];
  ...
}

это не случай, поскольку nums выйдет из области действия , когда i-я итерация цикла for завершится.

В результате блок памяти numsбыл сохранен во время первой итерации, будет помечен как свободный, когда начнется вторая итерация, что означает, что когда nums первой итерации будет выделено в стеке, он не будет знать о существовании nums первой итерации, поскольку она уже вышла из области видимости - она ​​не существует!

...