2010-10-23 56 views
0

此:为什么这给了我一个段错误?

bool grid[1280][1024]; 
for (int x = 0; x<1280; x++) 
{ 
    for (int y = 0; y<1024; y++) 
    { 
     grid[x][y] = false; 
    } 
} 

工作正常,但

bool grid[1280][1024]; 
bool grid2[1280][1024]; 

for (int x = 0; x<1280; x++) 
{ 
    for (int y = 0; y<1024; y++) 
    { 
     grid[x][y] = false; 
     grid2[x][y] = false; 
    } 
} 

给了我一个段错误。为什么?

+0

你有没有尝试用** gdb **来运行它? – 2010-10-23 13:44:08

+3

段错误或堆栈溢出?它看起来更像堆栈溢出给我.. – 2010-10-23 13:46:49

回答

5

可能没有足够的堆栈空间,你的第二个例子也在我的电脑上崩溃。尝试在堆上分配,甚至更好地使用适当的容器类:

#include <array> 
#include <vector> 

typedef std::array<bool, 1280> line; 

int main() 
{ 
    std::vector<line> grid(1024); 
    std::vector<line> grid2(1024); 

    // no initialization to false necessary 
} 

请注意我是如何切换宽度和高度的。您可能希望您的元素以这种方式对齐,以确保快速线性访问。

+0

是的,分配在堆上工作。谢谢! – Dataflashsabot 2010-10-23 15:04:34

+0

@Data:如果需要,您可以编辑您的问题并包含新代码以及讨论它。 – fredoverflow 2010-10-23 15:23:28

1

适用于我,使用g ++ 4.2.1时没有段错误,您是否单独尝试过这些示例?

+0

是的,使一个新的控制台应用程序导致同样的事情。我得到Windows 7'此应用程序已停止工作'框。使用调试器提醒我“分段错误”。 – Dataflashsabot 2010-10-23 13:46:39

+0

我刚刚在服务器2003上的Visual Studio 2008上尝试过它,我也得到这个错误,我可以推荐cygwin,所以你可以使用g ++ – Twig 2010-10-23 13:54:57

2

我认为sizeof(bool)被定义为与sizeof(char)相同。假设char在系统上占用一个字节,则第二个示例将尝试在堆栈上分配2*1280*1024个字节。 这是2.5MB。您的系统可能不会提供太多的堆栈空间。

使用标准库中的一个使用堆空间来存储其数据的传染者。

+0

@Joe:那是我内部的默认语言环境。感谢您修复它! – sbi 2010-10-24 13:47:00

1

可能是堆栈溢出。动态创建数组,它将起作用(因为它将在堆上创建)。或者,请使用std::vector< std::vector<char> >。 (是非常小心,如果你决定使用std::vector<bool> ..除非你不知道究竟你在做什么(它正常STL容器,只包含布尔变量),使用char使用它)。使用std::vector< std::vector<char> >将让您使用对象作为普通的二维数组。


编辑:
的std ::矢量<布尔>:“这种专业化被提供给优化空间分配:在该模板特,每个元件只占用一个位(这是八倍小于C++中的最小类型:char)

对向量成员返回的bool向量的元素的引用不是对bool对象的引用,而是对特定成员类型的引用,在向量类专业化内部“。 CPlusPlus

相关问题