char *pch = NULL;
printf("%s\n", pch);
printf вызывает ошибку Segmentation fault
Код:
Если убрать или заменить перенос строки, добавить любой символ слева/справа ошибка не возникает, printf как положено выводит "(null)", однако приведенная форматная строка начинает ругаться с аргументом NULL, на что printf отбрасывает коньки.
Мой компилятор:
gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)
printf("%s\n", pch?pch:"null");
а так тебя не устроит?
printf("%s\n", pch?pch:"null");
а так тебя не устроит?[/QUOTE]
Обойти эту ошибку не составляет труда, трудно было обнаружить. Пусть народ знает, какие грабли есть в printf
Это грабли void* и пр. C-style.
Код:
int Val = 0;
printf("%d%s\n", Val);
printf("%d%s\n", Val);
это тоже - просто напросто С-style :)
Дело не в "C-style" - это особенность реализации, присущей всем функциям с переменным числом аргументов - отсутствие какой-либо проверки количества и качества (соответствия типов) передаваемых параметров.
А это и есть C-style. :)
Пишу свою ОС, поентому printf у меня самописный, но использует стандартные макросы для переменного числа аргументов. Компилю gcc, при загрузке оси комп уходит в ребут. Причина та же?
Круто! Поделись секретом!
И ещё хочу поделиться опытом, возможно это и широко известный факт, но я не знал. У меня gcc выкидывает следующий финт ушами:
создаю структуру, два поля по 16 бит. Размер структуры должен по идее равняться 32 битам. Однако между двумя полями у меня появляется ещё одно, тоже на 16 бит, ни как не используемое. Возможно это какое-нибудь выравнивание, или ещё че, но намучился с этим изрядно.
В VC тоже по дефолту стоит выравнивание на 32 бита. Правда выравнивает вроде только по суммарной длинне структуры
У меня такого не было ни разу, единственное предположение - одно из полей является тоже структурой. Например wint_t и cchar_t в <curses.h> на самом деле структуры, хотя судя по названию стандартные "псевдонимы" (typedefы).