为什么这会给我一个段错误?

时间:2010-10-23 13:40:33

标签: c++ multidimensional-array segmentation-fault

此:

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;
    }
}

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

4 个答案:

答案 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} }