Я пытаюсь создать дерево AVL и вставить в него узел. Всякий раз, когда я пытаюсь добавить значение данных в узел дерева, моя программа аварийно завершает работу и возвращает значение 0xC0000005. Вот как я ввел элемент данных в заголовочный файл:
Всякий раз, когда я пытаюсь запустить следующие строки кода в функции вставки, я получаю сбой.
Я не знаю, что я делаю не так, пожалуйста, помогите мне.
Решение
Значит код возврата 0xC0000005 STATUS_ACCESS_VIOLATION , (Вы можете найти этот и другие коды состояния NT на MSDN: NTSTATUS ценности .) Ошибка происходит из-за NULL находится вне диапазона допустимых адресов для вашей программы. Перед разыменованием переменной указателя вы должны присвоить ей адрес допустимого объекта. Например:
Другие решения
Эта строка кодовых наборов nw быть нулевым указателем, другими словами, он ни на что не указывает. Попытка разыменования нулевого указателя приведет к неопределенному поведению. Вы должны выделить память для AVLTreeNode объект, а затем получить nw указать на это.
Вместо этого вам нужно то, что выделяет память и очки nw на него:
И помните, всякий раз, когда вы выделяете память new вам нужно освободить его, когда вы закончите с этим:
Почему программа завершается на S_object.findShortestWord(S_object.get(), str_value2); с Process returned -1073741819 (0xC0000005) execution time : 3.804 s ?
2 ответа 2
Нужно выделить память для str_value2 Например char str_value2[256] . Или char* str_value2 = new char[256] .
Сразу же компилятор ругается — использована неинициализированная переменная str_value2 !
Т.е. вы пишете куда-то, где это "куда-то" имеет совершенно случайный адрес. Что ж удивительного, что программа слетает?
Я программирую на C с помощью Code :: Blocks, моя программа компилируется правильно, но сбой при выполнении, предоставляя, по-видимому, очень известный "Process return -1073741819 (0xC0000005)".
Я искал evrywhere, и мне кажется, что моя проблема отличается от того, что я нашел в другом месте (просто для того, чтобы вы знали, что я долго искал ответ, прежде чем приходить сюда).
Я использую calloc несколько раз в своем коде, но это, похоже, не проблема: после попытки найти источник проблемы, кажется, что мои ошибки программы при попытке "вернуть 0;" в самом конце!
Когда я пытаюсь освободить все, что я выделил динамически (что я не сделал в первую очередь), программа теперь вылетает с этой точки.
У вас есть некоторые интуиции о том, что может быть источником проблемы?
Моя программа длится 500 строк и довольно грязная, поэтому я не ставил ее прямо сейчас, но, если хотите, я могу! Я новичок в C, так что, возможно, я что-то пропустил, спасибо вам за то, что я не был суровым со мной =)
///edit: найдено решение ///
Хорошо, я думаю, что понимаю, почему мой код так разбился (хотя я не понимаю, почему он так поздно врезался в программу, я думаю, что это должно было быть раньше. ).
Это была проблема при построении массивов, распределенных динамически.
Для тех, кого это интересует, вам нужно было получить структуру программы, чтобы получить проблему (что довольно уродливо, учитывая, что она не закончилась и не хватает комментариев для чтения). В моей программе есть две большие циклы (126- > 180 и 283-> 388); один, чтобы получить размер нескольких массивов, которые я распределяю динамически, а второй — заполнить их. Эти циклы должны быть почти одинаковыми. Однако я забыл половину цикла в первом. Так что размер был неправильным (слишком маленьким), и я заполнил нужное количество целых чисел.
Теперь он работает нормально. Спасибо, что помогли мне, я задал себе хорошие вопросы благодаря вам =) (хотя я до сих пор не понимаю, почему ошибка была в самом конце. )