Объявление 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];

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

0

Решение

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

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

4

Другие решения

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

3

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

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

Для возможных решений см. Вот или же Вот.

0
По вопросам рекламы [email protected]