[英]Why is this giving me a segfault?
这个:
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;
}
}
给我一个段错误。 为什么?
可能堆栈空间不足,您的第二个示例在我的PC上也崩溃了。 尝试在堆上分配,或者甚至更好地使用适当的容器类:
#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
}
注意我如何切换宽度和高度。 您可能希望元素以这种方式对齐以确保快速线性访问。
我认为sizeof(bool)
被定义为与sizeof(char)
相同。 假设char
在您使用的系统上占用一个字节,则第二个示例尝试在堆栈上分配2*1280*1024
字节。 那是2.5MB。 您的系统可能没有提供那么多的堆栈空间。
使用标准库中的容器之一,后者使用堆空间来存储其数据。
对我来说工作正常,使用g ++ 4.2.1都不会出现段错误,您是否单独尝试过这些示例?
可能是堆栈溢出。 动态创建数组,它将起作用(因为它将在堆上创建)。 或者,使用std::vector< std::vector< char > >
代替。 (必须非常小心,如果你决定使用std::vector< bool >
..除非你不知道到底自己在做什么(这是不正常的STL容器,只包含布尔变量),使用char使用它)。
使用std::vector< std::vector< char > >
将使您可以将该对象用作普通的二维数组。
编辑:
std :: vector <bool>: “提供此专业化功能是为了优化空间分配:在此模板专业化中,每个元素仅占用一位(比C ++中的最小类型char少八倍)。
由向量成员返回的对布尔向量的元素的引用不是对布尔对象的引用,而是一种特殊的成员类型,它是对单个位的引用,在向量类专门化内定义为“ 。CPlusPlus
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.