繁体   English   中英

为什么给我一个段错误?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM