此:
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 :(得分: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
}
请注意我是如何切换宽度和高度的。您可能希望以这种方式对齐元素以确保快速线性访问。
答案 1 :(得分:2)
我认为sizeof(bool)
被定义为与sizeof(char)
相同。假设char
在您所在的系统上占用一个字节,则第二个示例尝试在堆栈上分配2*1280*1024
个字节。 那是2.5MB。 您的系统可能无法提供那么多的堆栈空间。
使用标准库中的一个使用堆空间来存储其数据的容器。
答案 2 :(得分:1)
对我来说很好,没有使用g ++ 4.2.1的段错误,你是否单独尝试过这些例子?
答案 3 :(得分:1)
可能是堆栈溢出。动态创建数组,它将起作用(因为它将在堆上创建)。或者,使用std::vector< std::vector< char > >
代替。 (如果你决定使用std::vector< bool >
,请非常小心..除非你不知道你正在做什么完全(它是不是< / strong>普通的STL容器,只包含bools),与char一起使用)。
使用std::vector< std::vector< char > >
可以将对象用作普通的二维数组。
修改强>
的的std ::矢量&lt; bool&gt;:“提供此专门化以优化空间分配:在此模板专门化中,每个元素只占一位(比C ++中最小的类型小八倍:char)。
对向量成员返回的bool向量元素的引用不是对bool对象的引用,而是一个特殊的成员类型,它是对单个位的引用,在向量类专门化中定义为“。{{3} }