Не нарушено ли выделение памяти?
Попробуйте valgrind .
Маллок все еще падает.
Хорошо, я должен предположить, что вы имеете в виду, что SIGSEGV
(ошибка сегментации) запускает malloc
. Обычно это вызвано повреждением кучи . Повреждение кучи, которое само по себе не вызывает ошибки сегментации, обычно является результатом доступа к массиву за пределами границ массива. Обычно это далеко от точки, где вы звоните malloc
.
malloc
хранит небольшой заголовок информации "перед" блоком памяти, который он возвращает вам. Эта информация обычно содержит размер блока и указатель на следующий блок. Излишне говорить, что изменение любого из них вызовет проблемы. Обычно указатель следующего блока изменяется на недопустимый адрес, и при следующем вызове malloc
он в конечном итоге разыменовывает неверный указатель и ошибки сегментации. Или это не так и начинает интерпретировать случайную память как часть кучи. В конце концов его удача кончилась.
Обратите внимание, что free
может случиться так же, если освобождается блок или испорчен список свободных блоков.
Способ обнаружения ошибки такого рода полностью зависит от того, как вы обращаетесь к памяти, которую возвращает malloc
. malloc
одного struct
обычно не является проблемой; это malloc
массивов, которые обычно получают вас. Использование отрицательного (-1 или -2) индекса обычно дает вам заголовок блока для вашего текущего блока, а индексирование после конца массива может дать вам заголовок следующего блока. Оба являются допустимыми ячейками памяти, поэтому ошибки сегментации не будет.
Итак, первое, что нужно попробовать, это проверка диапазона. Вы упоминаете, что это появилось на сайте клиента; может быть, это потому, что набор данных, с которыми они работают, намного больше, или что входные данные повреждены (например, он говорит, что выделяет 100 элементов, а затем инициализирует 101), или они выполняют действия в другом порядке (что скрывает ошибку в ваше внутреннее тестирование) или выполнение чего-то, что вы еще не тестировали. Трудно сказать без дополнительных подробностей. Вы должны написать что-нибудь, чтобы проверить правильность ваших входных данных.