2014-03-29 8 views
0
char *p = NULL; 
printf("%s", p); 

Почему выше не происходит ошибка сегментации? НоПочему printf с n генерирует ошибку сегментации?

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

?

Чтобы добавить, что я знаю, что это неопределенное поведение для использования таким образом, но все еще задается вопросом, почему он генерирует ошибку сегментации 6 из 6 раз с \ n, но не без нее.

Мне задали этот вопрос в интервью, и я дал тот же ответ, что и его неопределенное поведение, но их ожидание состояло в том, чтобы дать ему разум, и я не знаю, что еще я могу добавить. Любые мысли об этом?

+5

Передача указателя NULL на 'printf()' вызывает Undefined Behavior. Вам повезло, что поведение ** было разным для двух ситуаций: вы должны это заметить и спросить, почему. Но нет причин, кроме неопределенного. Не делай этого. – pmg

+1

Ссылаясь на недопустимую память, это неопределенное поведение, это не имеет никакого отношения к '\ n'. – Rohan

+2

Передача указателя NULL на 'printf()' в порядке. Просто не передавайте его как допустимую строку или такую. Лежа нахмурился, и наказание было UB. – Deduplicator

ответ

5

Отличный пример undefined behaviour. Вы передаете NULL -поинтер на printf, где он ожидает указатель на буфер с символами null, поведение которого не определено. Это означает, что только гоблины в машине знают, что произойдет. Иногда кажется, что это работает, иногда это не так, иногда это дает ошибку, а в других случаях это просто сбой.

Мораль истории: не вызывать неопределенное поведение; не пропускайте NULL -поинтер до printf.

1

Оба примера ссылаются на UB, потому что строка формата ведет printf, чтобы ожидать действительную строку, в то время как вы поставляете (char*)0.

+0

thats right printf ("\ n% s", p); также работает. –

0

Вы сами являетесь отличным примером неопределенного поведения. Какая необходимость пропускать указатель NULL на printf(), заставить кого-то заставить вас? Как следует из названия это поведение
The incorrect codes to which standard forces no requirements

It can even launch mesilles unwillingly if you have sufficient hardware
Подробнее по ссылкам, указанным в ответе Kninnug.

+0

Лицо, которое отказалось от этого, укажите причину. – YakRangi

Смежные вопросы