простой массив вызывает исключение - PullRequest
2 голосов
/ 07 января 2011
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    float x[1000][1000];

    return 0;
}

Я получаю «Исключение первого шанса в 0x01341637 в s.exe: 0xC00000FD: переполнение стека».почему?

Ответы [ 4 ]

7 голосов
/ 07 января 2011

Ваш массив просто слишком велик для размещения в стеке.Вам не хватает места в стеке для 1000 * 1000 элементов.

Вам нужно разместить массив в куче.Вы можете сделать это, используя ключевое слово new, но проще всего использовать std::vector.

std::vector<std::vector<float> > floats(1000);
for (unsigned i = 0; i != floats.size(); ++i) floats[i].resize(1000);

Это даст вам двумерный вектор с плавающей точкой, с 1000 элементами на вектор.

Также см .: Ошибка сегментации на массивах большого размера

1 голос
/ 07 января 2011

float составляет 4 байта, поэтому 4 *1000* 1000 = 4 мегабайта.

"Размер стека по умолчанию равен 1 МБ"

См. Здесь: http://msdn.microsoft.com/en-us/library/tdkhxaks(v=VS.100).aspx

0 голосов
/ 07 января 2011

Просто объявите статический массив:

static float x[1000][1000];

Отредактировано, чтобы добавить:

Вздох Еще один тихий понижатель. Не то чтобы я удивился. Это, очевидно, самое простое решение проблемы ОП, поэтому оно нарушает основной принцип ООП-Комиссариата: Самое простое решение всегда неверно.

0 голосов
/ 07 января 2011

Как объяснили другие, размер объекта больше размера (по умолчанию), определенного для фрейма стека функций.Есть два решения: 1) создать объект в куче, которая, вероятно, будет больше;или 2) увеличить размер кадра стека функций, что может быть проблематично в 32-битной среде, поскольку вы можете исчерпать адресное пространство, но это легко сделать в 64-битной среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...