Объявление const char вызывает переполнение стека

В моем проекте VC++ CPPUNIT следующий код в модульном тесте вызывает исключение переполнения стека:

const int n = 1000000;
const char *test[n];

Исключение первого шанса по адресу 0x00AD89E7 в Utilities_Tests.exe: 0xC00000FD: переполнение стека (параметры: 0x00000000, 0x00132000). Необработанное исключение по адресу 0x00AD89E7 в Utilities_Tests.exe: 0xC00000FD: переполнение стека (параметры: 0x00000000, 0x00132000).

Но это не так:

const int n = 1000000;
char test[n];

Переполнение стека происходит до выполнения кода, поэтому точка останова в верхней части модульного теста не будет достигнута. Любая идея, почему это происходит? У меня есть обходной путь, но мне просто любопытно, что происходит.


person Community    schedule 08.03.2013    source источник


Ответы (3)


char — это 1 байт, char* — это, скорее всего, 4 байта (может быть больше, может быть меньше).

Таким образом, первый случай пытается выделить больше памяти (~ в 4 раза больше) в стеке. Память стека ограничена, просто бывает, что на вашей платформе в стеке помещается 1000000 байта, а 4 * 1000000 нет.

person Luchian Grigore    schedule 08.03.2013

На 32-битных компьютерах указатели имеют размер четыре байта, поэтому один миллион указателей равен четырем миллионам байтов (на 64-битных машинах размер указателя равен 64 битам, поэтому для вашего массива требуется восемь миллионов байтов). Размер стеков обычно составляет от одного до четырех мегабайт, поэтому массив char (один миллион байт) помещается в стеке, а массив указателей — нет.

person Some programmer dude    schedule 08.03.2013

Это происходит потому, что у вас заканчивается место в стеке. Пространство стека — это конечный ресурс для каждого потока; выполнение вложенных вызовов функций и использование локальных переменных потребляет его. Когда вы закончите, произойдет переполнение стека.

В вашем первом примере выделяется миллион char*, что обычно составляет либо 4 МБ, либо 8 МБ памяти. Ваш второй пример выделяет только 1 МБ. Типичный размер выделенного пространства стека также составляет около 1 МБ, так что результаты совсем не удивительны.

Возможные решения см. здесь или здесь.

person Jon    schedule 08.03.2013