2017-06-06 34 views
-6

我得到一个非常奇怪的错误,我完全绝望,因为它对我没有任何意义。所以考虑这个方案:在Windows上很简单的程序的分割错误

#include <iostream> 
using namespace std; 

int main(void) { 


int M, N; 
cin >> M; 
cin >> N; 
cout << "Danke" << endl; 

int *d; 
d[0] = 2; 

int a[2][3]; 
a[1][2] = 3; 
cout << a[1][2] << endl; 

return 0; 
} 

这工作得很好。不过,如果我使用完全相同的代码具有以下部分删除:

int a[2][3]; 
a[1][2] = 3; 
cout << a[1][2] << endl; 

...当我用Windows命令行我的Windows应用程序崩溃启动它,并使用Cygwin,我得到一个“分段错误”错误!我有一个Windows 7 64位计算机,并使用DevCpp进行编译(即使在这两种情况下,g ++都会给出分割错误,但我想这是因为它不会自动将程序转换为具有WinMain - 函数,所以不同的问题)。

任何人都可以帮忙吗?

+5

*“这工作得很好”* - 我不同意。 'd [0] = 2;'<===未定义的行为。 'd'是不确定的。 – WhozCraig

+0

@WhozCraig当然“未定义的行为”可能意味着*看起来*工作正常。这也可能意味着[恶魔从你的鼻子飞出](http://www.catb.org/jargon/html/N/nasal-demons.html)。 –

+0

IIRC,GCC将零初始化变量,这会使得它每次都会发生段错误(因为您正在取消引用空指针)。 –

回答

4
int *d; 
d[0] = 2; 

您尚未为d分配任何内存。它只是一个未初始化的指针,它不指向任何东西,所以你的商店是未定义的行为。

+0

啊,好的,谢谢!我误解了一些教程,其中可以定义可变大小的数组/指向数组的第一个位置(应该是d [0],我认为指针与数组相同)。那么指针是否应该始终被初始化是正确的,也就是说,在使用前有一个内存地址(NULL除外),不管是什么? – Yinyue

+0

如果你想使用它需要指向的东西(被初始化),是的。标准C++中也不允许使用VLAs(可变长度数组)。 –