Нет явных ошибок в ваших распределениях / освобождениях.
Похоже, что содержимое результата было как-то изменено (перезаписано каким-то диким указателем?).
Один простой способпроверьте, что нужно печатать значения адресов памяти указателя (используя printf ("% p", ...)) сразу после выделения с использованием strdup и непосредственно перед освобождением.Если это изменилось: bingo!
Сделайте это также с результатом, другим объяснением может быть то, что указатель на результат изменился (и впредь значения, на которые указывает).
Теперь, если указатель имеетдействительно изменилось, как точно определить, где это происходит?
Одним из решений может быть запуск программы с использованием отладчика.В некоторых случаях это может занять много времени, но обычно это работает.Но если это не вариант, есть другой способ.Я обычно нахожу это быстрее, чем использую отладчик.
Сохраняйте копию выделенного указателя в другой переменной, желательно, чтобы она была удалена от фрагмента памяти, где находится ваш поврежденный указатель (обычно это делает глобальный).
Теперь в потоке управления добавьте утверждения вроде:
assert (result == сохраненный_результат);
В каком-то месте утверждение должно завершиться неудачей, и вы в конечном итоге найдете проблему.
В обратном направлении, вы не должны забывать удалять свои утверждения, которые не следует оставлять в окончательном проекте.Чтобы быть уверенным в этом, просто удалите переменную save_result.Программа не будет компилироваться в режиме отладки, если осталось какое-либо утверждение.