2010-10-23 3 views
0

Это:Почему это дает мне 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; 
    } 
} 

дает мне Segfault. Зачем?

+0

Вы попытались запустить его с помощью ** gdb **? –

+3

segfault или переполнение стека? Это больше похоже на переполнение стека для меня .. –

ответ

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

+0

@Data: вы можете отредактировать свой вопрос и включить новый код, чтобы обсудить его, если хотите. – fredoverflow

1

Прекрасно работает для меня, нет segfaults при использовании g ++ 4.2.1, вы пробовали только эти примеры?

+0

Да, создание нового консольного приложения вызывает одно и то же. Я получаю окно Windows 7 «это приложение перестало работать». Использование отладчика предупреждает меня об ошибке «Сегментация». – Dataflashsabot

+0

Я только что попробовал это на Visual Studio 2008 на сервере 2003, и я тоже получаю эту ошибку, могу ли я рекомендовать cygwin, так что вы можете использовать g ++ – Twig

2

Я думаю, sizeof(bool) определяется как: sizeof(char). Предполагая, что char принимает один байт в системе, на которой вы находитесь, этот второй пример пытается выделить в стеке 2*1280*1024 байт. Это 2.5MB. Ваша система может не обеспечивать столько пространства стека.

Используйте один из компонентов стандартной библиотеки, который использует кучу пространства для хранения своих данных.

+0

@Joe: Это был мой внутренний стандарт по умолчанию.Спасибо за исправление! – sbi

1

Возможно переполнение стека. Создайте массив динамически, он будет работать (потому что он будет создан в куче). Или, вместо этого используйте std::vector< std::vector<char> >. (Быть очень осторожны, если вы решите использовать std::vector<bool> .. если вы не знаете, что именно вы делаете (это не нормальный STL контейнер, содержащий только Bools), используйте его с гольца).

Использование std::vector< std::vector<char> > позволит вам использовать объект как обычный двумерный массив.


EDIT:
станд :: вектор < BOOL>: «Эта специализация предусмотрена для оптимизации распределения пространства: В этой специализации шаблона, каждый элемент занимает только один бит (что в восемь раз меньше, чем наименьший тип в C++: char).

Ссылки на элементы вектора bool, возвращаемые членами вектора, не являются ссылками на объекты bool, а особый тип члена, который является ссылкой на один бит, определенный внутри специализации векторного класса как ". CPlusPlus

Смежные вопросы