Есть ли причина, по которой массивы в памяти «уходят», а стек функций обычно «идет вверх»? - PullRequest
1 голос
/ 31 августа 2011

Хотя фактическая реализация зависит от платформы, эта идея является причиной потенциально опасных переполнений буфера. Например,

-------------
|   arr[0]  | \
-------------  \
|   arr[1]  |   -> arr[3] is local to a function
-------------  /
|   arr[2]  | /
-------------
| frame ptr |
-------------
|  ret val  |
-------------
|  ret addr |
-------------
|    args   |
-------------

Мой вопрос: есть ли причина, по которой локальный массив из-за отсутствия лучшего глагола стекает вниз? Вместо этого, если массив должен был заполниться, разве он не уменьшит количество ошибок переполнения буфера, которые перезаписывают адрес возврата?

Конечно, используя потоки, можно перезаписать адрес возврата функции, которую вызвала текущая функция. Но давайте пока проигнорируем это.

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

Массив в стеке работает так же, как массив в куче, т. Е. Его индекс увеличивается при увеличении адреса памяти.

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

0 голосов
/ 31 августа 2011

Чтобы иметь подмассив, вы обычно передаете только указатель на него. Любая операция индексирования должна знать размер массива, если вы не хотите сделать весь индекс памяти задом наперед - но если бы вы это сделали, вы бы просто оказались в такой же ситуации: P.

0 голосов
/ 31 августа 2011

Я не могу назвать источник для этого, но я верю, что это так, чтобы вы могли перешагнуть через память.Рассмотрим while *p++ или что-то в этом духе.

Теперь вы могли бы просто сказать while *p--, но, думаю, если бы у них был выбор, они предпочли бы перезаписать чужие данные, чем их собственное возвращаемое значение:) Поговорим о «жадном алгоритме» (хар хар)

...