2016-05-02 1 views
0

В приведенном ниже коде есть arr[n] выделяется из стека или кучи?Когда размер массива определяется во время выполнения, выделяется ли он из стека или кучи?

Я запутался, так как в целом размер массива определяется во время компиляции. Как работает код ниже?

#include<stdio.h> 
int main(){ 
    int n; 
    scanf("%d",&n); 
    int arr[n]; 
    for(int arr_i = 0; arr_i < n; arr_i++){ 
     scanf("%d",&arr[arr_i]); 
    } 
    for(int arr_i = (n-1); arr_i >= 0; arr_i--){ 
     printf("%d ",arr[arr_i]); 
    } 
} 
+1

Я не вижу код выше – Marco

+1

Пожалуйста, не положил код – Ajay

+0

К сожалению, я добавил его сейчас – Vignesh

ответ

3

Это переменная длина массива. Требуется в стандарте C99, а для C11-совместимых компиляторов - необязательно, и, как сказано другими в комментариях, он не поддерживается в C++ любой версии.

Он объявляет массив с продолжительностью автоматического хранения с обычно реализуется с хранилищем стека. Но помните, что концепция стека и кучи, даже если она используется всеми компиляторами, является только деталью реализации.

+2

@alk Право. Фактически это было санкционировано на C99, только для того, чтобы стать дополнительным в C11, AFAIR. –

+0

@alk Oups, я написал его не той стороной! Многие благодарят за то, что заметили ... –

2

В вашем случае, то, что вы используете, называется variable length array. Эта функция была введена в C99, но снова сделана необязательной в C11.

На самом деле стандарт C не налагает никаких спецификаций для распределения VLA. Это решение оставляется компилятору.

The widely-used gcc allocates VLAs on stack memory.

2

В C99 были добавлены массивы переменной длины. В C11 они были сведены к необязательным.

В стандарте C не указывается, где хранятся переменные, поэтому это зависит от производителя компилятора.

gcc stores VLA:s on the stack.

1

До появления массивов переменной длины (VLA) с C99 размер должен был быть целочисленной константой, которая включает в себя возможность выражения, сформированного из постоянных целочисленных значений.

Сказав, что память, выделенная для a[n], как правило, статические, как и в случае НКУ, но нет никакой формальной спецификации о том, как память должна быть выделена для VLA

Интересные ссылки

  1. Which Compiler Should I trust?

  2. GNU-GCC note on VLA.

  3. Diary of a graphics programmer (см Чего не хватает)

  4. Enabling VLAs in MS Visual C++

0

GCC (GNU Compiler Collection) компилятор добавил много расширений для C, которые обычно упускается из виду. Эти добавленные расширения могут помочь нам упростить разработку приложений C. Одним из расширений было добавление массивов переменной длины и массива нулевой длины.

В приведенном ниже коде arr [n] выделяется из стека или кучи.

GCC разрешает объявление массивов с использованием непостоянных выражений. Это возможно в ISO C99, но не в C89. Компилятор GNU C выделяет память для массивов переменной длины в стеке. VLA, как и все объекты в C, ограничены байтами SIZE_MAX.

Источник - https://en.wikipedia.org/wiki/Variable-length_array#cite_note-7

0

При объявлении массива Int обр [п]; он будет иметь автоматическую область видимости, т. е. он будет иметь область действия только внутри этой функции. И память для этого будет выделена из стека. Только те переменные, которые выделяются с помощью malloc, calloc и т. Д., Перейдут в кучу. Для получения дополнительной информации Вы можете посмотреть в memory layout of c program & automatic variable

Смежные вопросы