Просто для уточнения что-то многие люди, кажется, отсутствует:
TDD, в смысле "тест проваливающего записи, пишет код, чтобы сделать тестовую передачу, осуществить рефакторинг, повториться" , Является обычно самым эффективным и полезным, когда Вы пишете единица тесты.
Вы пишете модульный тест вокруг просто класса/функции/единицы кода, Вы продолжаете работать, с помощью насмешек или тупиков к краткому обзору остальная часть системы.
"Автоматизированное" тестирование обычно относится к высокоуровневой интеграции/принятию/функциональным испытаниям - Вы можете делать TDD вокруг этого уровня тестирования, и это часто - единственная опция для в большой степени ui-driven код, но необходимо знать, что этот вид тестирования более хрупок, тяжелее к тесту записи сначала и никакой замене для поблочного тестирования.
Это потому, что вывод из printf ()
буферизован. Вы можете добавить fflush (stdout);
сразу после вашего printf
, и он будет печатать.
Также вы можете сделать это:
fprintf(stderr, "error string");
, поскольку stderr
является не буферизован.
Если ошибка сегментации возникает слишком скоро после printf, и выходной буфер не был очищен, вы не увидите эффекта printf.
Большинство реализаций libc буферизуют вывод printf. Обычно достаточно добавить новую строку (\ n) к выходной строке, чтобы заставить ее очистить содержимое буферов.
Вы можете очистить выходной буфер сразу после printf, чтобы убедиться, что это произойдет до ошибки seg. Например. fflush (стандартный вывод)
Случайный совет: если вы пытаетесь отладить ошибки сегментации, обязательно попробуйте valgrind . Так становится намного проще!
Вы получили несколько ответов, указывающих на буферизацию выходного потока.
Хорошо это или плохо, но это далеко не единственная возможность. Ошибка сегментации означает, что ОС обнаружила, что вы сделали что-то не так, как правило, записано вне выделенной памяти. К лучшему или худшему (в основном, к худшему) выполнение почти чего-либо в такой ситуации может достаточно изменить то, что программа делает внутри, чтобы предотвратить обнаружение проблемы, по крайней мере, в то время / в ситуации, когда она была обнаружен ранее.
Например, ошибка сегмента могла быть вызвана записью через неинициализированный указатель - который случайно содержал определенное значение (возможно, небольшое целое число), потому что функция вы ' d, который ранее был вызван, оставил это значение в нужном месте в стеке, которое, когда была вызвана более поздняя функция, и использовал то же значение в качестве указателя, оно (достаточно надежно) содержало значение, которое ОС обнаружила как место, которое вам не разрешалось написать. Однако вызов printf может означать, что вы оставляете совершенно другое значение в том месте стека, которое вы используете без инициализации. Вы все еще пишете где-то, что не должны, но теперь это может быть то место, где ОС не знает , что вам не следует писать.
Вы оставляете совершенно другое значение в том месте стека, которое вы используете без инициализации. Вы все еще пишете где-то, что не должны, но теперь это может быть то место, где ОС не знает , что вам не следует писать. Вы оставляете совершенно другое значение в том месте стека, которое вы используете без инициализации. Вы все еще пишете где-то, что не должны, но теперь это может быть то место, где ОС не знает , что вам не следует писать.