2016-02-08 104 views
0

爲什麼如果我們在全局或函數範圍中聲明堆棧變量,會有什麼不同?由於堆棧溢出,兩個示例崩潰之一。但只有在範圍內定義變量的那個。在全局/函數範圍中聲明變量。堆棧差異?

不會崩潰:

constexpr size_t MAX = 1000000; // Customise 

int main() 
{ 
    int arr[MAX]; 

    return arr[MAX - 1]; 
} 

不會崩潰:

constexpr size_t MAX = 1000000; // Customise 

int arr[MAX]; 

int main() 
{ 
    return arr[MAX - 1]; 
} 

信息:Cygwin的,GCC 4.9

編輯:所以我知道,第二個例子已經是在數據存儲分割。數據段有多大?它可能像堆區一樣大嗎?

+3

「爲堆棧變量不同的」 - 好,因爲第二個*不是*堆棧變量。堆棧的大小是有限的,相對於整個程序的容許大小來說非常小。這是爲非常大的數組使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)的好理由。 – BoBTFish

+1

全局變量實際上並不是堆棧變量。他們分配在加載時間。此外,似乎不應該崩潰,當我測試它沒有。 –

+1

希望[this](https://en.wikipedia.org/wiki/Data_segment#Program_memory)有所幫助。 –

回答

2

第一個

constexpr size_t MAX = 1000000; // Customise 

int main() 
{ 
    int arr[MAX]; 

    return arr[MAX - 1]; 
} 

您在函數聲明數組,所以它進入棧是有限的,將導致堆棧溢出。

第二個

constexpr size_t MAX = 1000000; // Customise 

int arr[MAX]; 

int main() 
{ 
    return arr[MAX - 1]; 
} 

您在全球的聲明吧,應該是功能之間入店如此這般堆(相當大)。所以不要在這裏使用堆棧。

來源:Static and global variable in memory

+0

不是堆(通常) –

+0

@YamMarcovic是的,我想一些特定的細分市場。但在講座中,我因特定的原因得到了堆。我認爲在課堂上教會更容易。 – AchmadJP