Объявление 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];
Переполнение стека происходит до выполнения кода, поэтому точка останова в верхней части модульного теста не будет достигнута. Есть идеи, почему это происходит? У меня есть обходной путь, но мне просто любопытно, что происходит.
3 ответа
char
1 байт char*
это, скорее всего, 4 байта (может быть больше, может быть меньше).
Таким образом, первый случай пытается выделить больше памяти (~ в 4 раза больше) стека. Память стека ограничена, бывает так, что 1000000
байты умещаются на вашей платформе в стеке, но 4 * 1000000
нет.
На 32-битных компьютерах указатели имеют четыре байта, поэтому один миллион указателей равен четырем миллионам байтов (на 64-битных машинах размер указателя составляет 64 бита, поэтому для вашего массива восемь миллионов байт). Стеки обычно находятся в диапазоне от одного до четырех мегабайт, так что вы char
массив (один миллион байт) помещается в стек, а массив указателей - нет.
Это происходит потому, что вам не хватает места в стеке. Пространство стека является конечным ресурсом для каждого потока; выполнение вложенных вызовов функций и использование локальных переменных потребляет их. Когда вы заканчиваете, происходит переполнение стека.
Ваш первый пример выделяет миллион char*
, который обычно будет 4 или 8 МБ памяти. Ваш второй пример выделяет только 1 МБ. Типичный размер выделенного стекового пространства также составляет около 1 МБ, поэтому результаты не являются неожиданными.