2016-03-28 5 views
0
#define N 10000000 
int arr[N]; 

int main(void) 
{ 
    int i; 
    for(i=0;i<N;i++) 
     arr[i]=i+1; 
} 

Почему объявление массива глобально не дает ошибок компиляции? Какова вероятность наличия смежной памяти N * 4 байта в стеке? То же самое для объявления массива с ключевым словом static.Как глобальная декларация массива большого размера работает в C?

+3

Глобальные переменные обычно помещаются в разделы 'data' или' bss', а не в стек. – owacoder

+1

... и это потому, что глобальные переменные _global_. Не только видимый для одной функции. – gnasher729

ответ

2

enter image description here

Это изображение должно помочь. Вы можете видеть, что в стеке мы выделяем память только для локальных переменных и массивов, а также для вызовов функций и указателей. Хотя глобальные переменные/статические хранятся в Перми Хранение.

+0

«Обычно» было бы хорошо где-то в вашем посте. Собственно, все это зависит от компилятора/компоновщика и нигде не указывается. Спецификации C просто устанавливают * требования * на хранилище, а не там, где это необходимо. У меня есть компилятор где-то, который помещает глобальные переменные в самую нижнюю часть стека (т. Е. Вверх фрейм стека 'main'). – tofro

2

Глобальные, статические глобальные и статические переменные не нужно помещать в стек. Стек - это переменные, которые временно существуют и которые относятся к вызову функции, прямо противоположные статическим/глобальным переменным, которые существуют как единое целое и всегда присутствуют в объекте памяти.

Кроме того, поскольку это указано в спецификациях C, статические и/или глобальные переменные имеют инициализацию по умолчанию для нулей. Поскольку большинство (если не все) компиляторов не помещают их в стек, это ничего не стоит в плане времени выполнения программы.

+0

«потому что они не находятся в стеке» - я бы сказал, «потому что это указано в спецификациях C» (см. Http://stackoverflow.com/a/8138702/2564301 для цитаты). «Стойка», с другой стороны, является * не * частью спецификаций C: http://stackoverflow.com/a/79936/2564301 (второй комментарий). – usr2564301

+0

@Rad Lexus Это лучше сэр? – jdarthenay

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