2010-10-23 95 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

相關問題