Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Segmentation error C++

Родион Перкин Ученик (94), открыт 3 дня назад
 std::string get_string(std::string section, std::string name) {  
bool ret = false;
int section_index = 0;
for (int i = 0; i < sections.size(); i++) if (sections[i] == section) { section_index = i; ret = true; break; }
if (!ret) { first_error += SECTION_NOT_FOUND_ERR; return STR_NULL; }
for (int i = 0; i < names[section_index].size(); i++) if (names[section_index][i] == name) return values[section_index][i];
first_error += NAME_NOT_FOUND_ERR;
return STR_NULL;
}
Гд может быть ошибка в коде, почему выбивает на ошибку сегментации?
3 ответа
PC USER Просветленный (27528) 3 дня назад
Дебаггером пробеги.
sections откуда берётся.
Родион ПеркинУченик (94) 3 дня назад
Я хочу, но компилирую на андроиде, ранее на ПК но он сломался, вынужден на телефоне
dragon YT Ученик (163) 3 дня назад
DragonShop FANPAY ?

Ответ:Ошибка сегментации (segmentation fault) в данном коде C++ наиболее вероятно возникает из-за попытки доступа к
памяти за пределами выделенного массива или к неинициализированному указателю. Рассмотрим возможные
причины:
1. sections не инициализирована или имеет неправильный размер: Если вектор sections пуст или его размер
меньше, чем значение i в цикле for (int i = 8; i < sections.size(}; i++), программа попытается обратиться к
несуществующему элементу, вызывая ошибку сегментации. Аналогично, неправильный размер может привести
к ошибке в последующих строках кода.
2. names или values не инициализированы или имеют несоответствующие размеры: Внутренние циклы
ИспользуюT names[section index] И values[section index]. Eсли section index выходит за пределы допустимых
индексов для names или values (например, если section_index больше или равно размеру этих векторов),
произойдет ошибка сегментации. Важно, чтобы размеры names И values были согласованы между собой и с
размером sections, и чтобы все они были корректно инициализированы. Вероятно, размер names[section index] не
соответствует ожидаемому.
3. STR_NULL некорректно определена: Если STR_NULL не является правильно инициализированной пустой строкой
("") или специальным значением, возврат stR может привести к неопределенному поведению, включая
ошибку сегментации.
4. sections, names, values Являются указателями: Если sections, names, илИ values Являются указателями, а не
векторами или массивами, необходимо убедиться, что они корректно инициализированы и указывают на
действительную память. Неинициализированный указатель может привести к ошибке сегментации при
попытке доступа к памяти по нему.
5. Переполнение буфера: Хотя в данном коде это менее вероятно, если values[section_index][i] содержит строку,
и в какой-то момент происходит попытка записи в неё больше данных, чем выделено памяти, то может
произойти переполнение буфера, что также может привести к ошибке сегментации.
Для отладки:
• Проверьте инициализацию: Убедитесь, что sections, names, И values корректно инициализированы перед
вызовом функции get_string. Распечатайте их размеры перед циклами, чтобы убедиться в их корректности.
• Добавьте проверку границ: Добавьте проверки на section_index и і в циклах, чтобы убедиться, что они не
выходят за пределы допустимых индексов.
• Используйте отладчик: Запустите код в отладчике (например, gdb), чтобы пошагово пройти по коду и
увидеть, где именно происходит ошибка сегментации. Отладчик покажет вам значения переменных и позволит
определить, какой именно доступ к памяти вызывает проблему.
• Проверьте STR_NULl: Убедитесь, что STR NULL корректно определена и инициализирована.
Без знания того, как именно инициализируются sections, names И values, и типа данных STR_NULL, более
дать невозможно. Предоставление большего контекста кода поможет в более точной диагностике
точный ответ
проблемы.
PC USERПросветленный (27528) 3 дня назад
Это ИИ выдал столько текста?
dragon YTУченик (163) 3 дня назад
Нет
dragon YT, Да
Илья Горбачев Знаток (341) 3 дня назад
Для начала бы ты разбил свой код на более читаемые куски, например так:


 string get_string(string section, string name) 
{
bool ret = false;
int section_index = 0;

for (int i = 0; i < sections.size(); i++)
if (sections[i] == section) // maybe error hides
{
section_index = i;
ret = true;
break;
}

if (!ret)
{
first_error += SECTION_NOT_FOUND_ERR;
return STR_NULL;
}

for (int i = 0; i < names[section_index].size(); i++)
if (names[section_index][i] == name)
return values[section_index][i];

first_error += NAME_NOT_FOUND_ERR;
return STR_NULL;
}
из возможных проблем, вижу, что у тебя сравнивается sections[i] с sections, хотя если уж на то пошло, то как ты можешь сравнивать адрес первого элемента массива со значением элемента массива уже по индексу?
Похожие вопросы