2017-04-02 248 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并强制访问超出界限。

相关问题