Как и многие молодые программисты, я узнал о полезности вставки многочисленных выражений «вывод на консоль» «здесь1», «здесь2» и т. Д. В разные моменты кода, чтобы выяснить, когда мои программы работают неправильно. Эта техника отладки методом грубой силы спасла меня много-много раз за все время обучения CS. Однако когда я начал программировать на C, я наткнулся на интересную проблему. Если бы я попытался запустить
void* test;
printf("hello world");
test[5] = 234;
Конечно, я получаю segfault за недопущение выделения памяти для testChar. Тем не менее, вы могли бы логически подумать, что «hello world» будет напечатан до того, как произойдет ошибка seg, поскольку это поток кода, но, по моему опыту, всегда бывает, что ошибка seg возникает первой, и «hello world» "никогда не выводится на консоль вообще. (Я не смог протестировать этот точный пример, но я сталкивался с подобной ситуацией много раз, используя gcc на Linux-коробке.) Я предполагаю, что это связано либо с компилятором, переставляющим некоторые вещи, и / или printf используя некоторый тип буфера, который очищается асинхронно и поэтому не является немедленным. Это полностью спекуляция с моей стороны, потому что я, честно говоря, не знаю, почему это происходит. На любом другом языке, который я использовал, независимо от того, какую проблему вызывала строка «testChar = ...», «hello world» все равно печатался бы, и, таким образом, я мог определить, где проблема.
Мой вопрос: почему это происходит, когда я программирую на C? Почему привет мир не печатается первым? И во-вторых, есть ли лучшая техника отладки программирования на С, чем эта, которая выполняет ту же самую базовую вещь? Как, например, простой / интуитивно понятный способ найти строку кода, которая является проблемой?
Редактировать: случайно привел рабочий пример, ха-ха. То, что у меня есть сейчас, должно стать причиной ошибки. Забавно, как обычно, когда я не хочу сегфо, я получаю его, а теперь, когда я действительно хотел его, я написал юридический код!