Определяет ли этот код поведение?Определяется ли печать NULL-строки?
char *str = NULL;
printf("%s\n",str);
В контексте стандартов C++ (98/03 и 11) и C (99).
Определяет ли этот код поведение?Определяется ли печать NULL-строки?
char *str = NULL;
printf("%s\n",str);
В контексте стандартов C++ (98/03 и 11) и C (99).
неопределенное поведение в C
(С99, 7.19.6.1p8) «с Если нет модификатора л длина не присутствует, аргумент должен быть указателем на начальный элемент массива символов типа «.
с некоторыми компиляторами/libc он печатает (null)
и с некоторыми другими его segfaults.
(Примечание: в нарушение С в shall
, который не является сдерживающим фактором является неопределенное поведение, см 4.p2 "Conformance" в стандарте C)
@ThiefMaster Это приводит к неопределенному поведению в результате значения «должно» в стандартах в целом и в стандартах С в частности. См. Раздел «Соответствие» в начале. –
Если бы вы могли найти соответствующую главу в стандарте C++, это было бы здорово. –
@Let_Me_Be: стандарт C++ обычно не переопределяет функции C, он начинается с ссылки на стандарт C по этой причине. –
Да.
printf
будет разыменовывать указатель str
и разыменовывать указатель NULL является UB.
Является ли 'printf' derenferencing указателем std частью стандарта? –
@codaddict Разве вы не имеете в виду «Нет» в качестве ответа на вопрос? –
Отказ от ссылки null
Указатель в C
производит undefined behavior
, что может быть катастрофическим. Однако большинство реализаций просто останавливают выполнение рассматриваемой программы, как правило, с ошибкой сегментации.
Пожалуйста, проверьте this
почему -1 для этого? –
@MS Потому что это совершенно не имеет значения. –
@Let_Me_Be Не могли бы вы рассказать о своей причине, почему вы думаете, что это «совершенно неуместно»? –
Извините, звучит так жестко, но: если вы должны спросить, вы, вероятно, делают это неправильно. –
Нет такой вещи, как «пустая строка». Вряд ли что-то вроде «строки» для начала (если вы не подразумеваете «std :: string», конечно). –
@KerrekSB Из стандарта: «Строка ** ** - это непрерывная последовательность символов, заканчивающихся и включающая первый символ ». Но да, строка NULL была упрощенной с моей стороны. –