2012-01-10 3 views
3

Определяет ли этот код поведение?Определяется ли печать NULL-строки?

char *str = NULL; 
printf("%s\n",str); 

В контексте стандартов C++ (98/03 и 11) и C (99).

+3

Извините, звучит так жестко, но: если вы должны спросить, вы, вероятно, делают это неправильно. –

+0

Нет такой вещи, как «пустая строка». Вряд ли что-то вроде «строки» для начала (если вы не подразумеваете «std :: string», конечно). –

+0

@KerrekSB Из стандарта: «Строка ** ** - это непрерывная последовательность символов, заканчивающихся и включающая первый символ ». Но да, строка NULL была упрощенной с моей стороны. –

ответ

4

неопределенное поведение в C

(С99, 7.19.6.1p8) «с Если нет модификатора л длина не присутствует, аргумент должен быть указателем на начальный элемент массива символов типа «.

с некоторыми компиляторами/libc он печатает (null) и с некоторыми другими его segfaults.

(Примечание: в нарушение С в shall, который не является сдерживающим фактором является неопределенное поведение, см 4.p2 "Conformance" в стандарте C)

+0

@ThiefMaster Это приводит к неопределенному поведению в результате значения «должно» в стандартах в целом и в стандартах С в частности. См. Раздел «Соответствие» в начале. –

+0

Если бы вы могли найти соответствующую главу в стандарте C++, это было бы здорово. –

+1

@Let_Me_Be: стандарт C++ обычно не переопределяет функции C, он начинается с ссылки на стандарт C по этой причине. –

1

Да.

printf будет разыменовывать указатель str и разыменовывать указатель NULL является UB.

+0

Является ли 'printf' derenferencing указателем std частью стандарта? –

+1

@codaddict Разве вы не имеете в виду «Нет» в качестве ответа на вопрос? –

-1

Отказ от ссылки null Указатель в C производит undefined behavior, что может быть катастрофическим. Однако большинство реализаций просто останавливают выполнение рассматриваемой программы, как правило, с ошибкой сегментации.

Пожалуйста, проверьте this

+0

почему -1 для этого? –

+1

@MS Потому что это совершенно не имеет значения. –

+0

@Let_Me_Be Не могли бы вы рассказать о своей причине, почему вы думаете, что это «совершенно неуместно»? –