2017-04-02 245 views
-5

考慮下面的代碼:爲什麼這個C++代碼在運行時給我分段錯誤錯誤?

#include <iostream> 
using namespace std; 

int main() 
{ 
    const int max=500008; 
    long long cordx[max],cordy[max]; 
    char type[max]; 
    int n; 
    cin>>n; 
    for(int m=0;m<n;m++) 
     cin>>type[m]>>cordx[m]>>cordy[m]; 
    return 0; 
} 

此代碼是給我上運行時分段錯誤。

但是,當我改變了這樣的代碼:

for(m=0;m<n;m++) 
    cin>>cordx[m]; 

它不給我任何錯誤。

它給了我只有當我嘗試輸入類似這樣的錯誤:

cin>>type[m]>>cordx[m]>>cordy[m]; 
+2

也許陣列對於堆棧太大 –

+0

嘗試減小陣列的大小,問題是否仍然存在? – Sniper

+0

寫入'cordx'的區域可能全部都適合可用存儲器,並且只有當程序正在寫入下一個變量時,程序纔會出現越界。 – user4581301

回答

3

很長很長一般是8個字節。 cordxcordy每個請求空間爲500008個自動存儲。這大約是8 MB的存儲空間,並且可以遠遠超過或達到最大的自動存儲容量。典型的PC使用自動存儲堆棧,堆棧通常在1到10 MB之間。

解決方案是使用std::vector分配存儲空間從更大的動態存儲或定義變量的靜態存儲被分配(讓他們static或全局定義它們)。

此外,用戶可以指定大於500008的n並強制訪問超出界限。

相關問題