Ошибка переполнения стека в C, перед любым шагом

#c #visual-studio-2008 #stack-overflow

#c #visual-studio-2008 #переполнение стека

Вопрос:

Когда я пытаюсь отладить свою программу на C, и даже до того, как компилятор начнет выполнение любой строки, я получаю: «Необработанное исключение в 0x00468867 в HistsToFields.exe: 0xC00000FD: переполнение стека.»

Я понятия не имею, как определить проблему, поскольку программа даже не начала выполнять какую-либо строку (или, по крайней мере, это то, что я вижу из окна отладки компилятора). Как я могу определить, что вызывает переполнение, если еще не выполнена ни одна строка моей программы? «Когда отладчик прерывает работу, он указывает на строку в chkstk.asm»

Я использую Microsoft Visual Studio 2008 на win7.

Я установил размер резерва стека равным 300000000

PS: раньше программа выполнялась нормально, но на другой машине.

У меня есть база данных (120000 x 60) в формате csv, мне нужно изменить ее на разделитель пробелов. Программа (которую я не писал сам) определяет структуру выходного файла:

 `struct  OutputFileContents {
    char    Filename[LINE_LEN];
    char    Title[LINE_LEN];
    int NVar;
    char    VarName[MAX_NVAR][LINE_LEN];
    char    ZoneTitle[LINE_LEN];
    int     NI;
    int     NJ;
    int     NK;
    double  Datums[MAX_NVAR];
    double  Data[MAX_NVAR][MAX_NPOINT];`  
  

Этот последний массив «Data[][]» — это то, что содержит все выходные данные. отсюда и огромный размер.
Этот размер массива «MAX_NPOINT» задан в исходном файле заголовка в проекте, и этот заголовок используется несколькими программами в проектах.

Заранее большое вам спасибо. Ахмад.

Комментарии:

1. 1 для ссылки на переполнение стека.

2. У вас где-то бесконечная рекурсия.

3. Если вы получаете исключение, значит, ваш компилятор не только запущен, он завершен, и вы запустили свою программу (которая завершилась ошибкой)

4. @hoohaahi компилятор не запускает программу.

5. Хорошо, но 100 тысяч строк по 60 столбцов, если вы конвертируете из csv в пробелы, вам нужно читать только строку за раз! Вам не нужно все это в памяти.

Ответ №1:

Сначала IDE != компилятор ! = отладчик.

Во-вторых, и не имеет значения, почему отладчику не удается отладить приложение — такой огромный набор данных в стеке является серьезной ошибкой проектирования. Исправьте эту ошибку проектирования, и проблема с отладчиком исчезнет.

Что касается причины сбоя отладчика… понятия не имею. Установлено слишком мало оперативной памяти? 32-битная или 64-битная платформа? Бесконечная рекурсия при построении статических переменных? Не могу сказать, не глядя на то, что вы нам не показали, например, исходный код, спецификации среды и т.д.

Редактировать: На случай, если подсказка пропущена: глобальные / статические объекты данных создаются перед main() началом выполнения. Бесконечная (или просто слишком глубокая) рекурсия в этих конструкторах может вызвать переполнение стека. (Я предполагаю, что C вместо C, поскольку в сообщении об ошибке, которое вы дали, говорится «необработанное исключение».)

Правка 2: Вы добавили, что у вас есть «база данных», которую вам нужно преобразовать в разделенную пробелом. Не видя остальной части вашего кода: Пытаться выполнить все преобразование за один раз в памяти — не очень хорошая идея. Прочитайте запись, преобразуйте ее, запишите. Повторите. Если вам нужны такие вещи, как «самая длинная запись», чтобы определить формат вывода, выполните итерацию по вводу один раз только для чтения, чтобы найти размеры вывода, затем повторите итерацию, выполняя фактическое преобразование.

Комментарии:

1. Хорошо, большое вам спасибо, я изменил размер одного из массивов с 145000 на 32000, и он работал нормально, но теперь у меня будут проблемы с обработкой всех имеющихся у меня данных? Извините, я не силен в этом. какой другой вариант для обработки такой большой базы данных без использования массивов такого размера.?

2. Что вы пытаетесь сделать с данными? Удивительно, что вам постоянно нужен весь набор данных в памяти. Можете ли вы постепенно вычислить то, что вы пытаетесь?

3. @Andrew Myers: Пожалуйста, проверьте отредактированную версию моего вопроса.

4. Различие между IDE, запускаемым ею компилятором и запускаемым им отладчиком является педантичным. Кроме того, то, что OP описывает как пользовательский интерфейс для отладчика, не является сбоем отладчика. По природе своей ошибки, отладчик достиг точки останова в модуле библиотеки MS C во время настройки перед вызовом main() — с отладчиком все в порядке. Решение для пользовательского интерфейса — посмотреть на стек вызовов и понять, что такое crt0.obj .

5. @Heath Hunnicutt: Правильное общение — это не педантичность, это необходимый навык. Сказать, что у вас возникла проблема «перед запуском компилятора » или «перед запуском отладчика » или «перед запуском программы » — это три очень, очень разные вещи. Говорите, что вы имеете в виду, подразумевайте то, что вы говорите.