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

왜 세그먼트 화 오류가 발생하지 않습니까? 그러나 n이있는 printf가 세그먼테이션 결함을 생성하는 이유는 무엇입니까?

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

?

덧붙이는 것은이 방법으로 사용하는 것이 정의되지 않은 동작이지만 여전히 왜 그것이 없으면 6 번 중 6 번에서 세그먼트 화 오류 6을 생성하는지 궁금합니다.

나는 인터뷰에서이 질문을 받았지만 그 정의되지 않은 행동과 동일한 대답을 주었지만 그들의 기대는 그 이유를 설명하는 것이었고 나는 무엇을 추가 할 수 있을지 모른다. 그것에 대한 어떤 생각?

+5

'printf()'에 대한 NULL 포인터를 전달하면 정의되지 않은 동작이 호출됩니다. 운이 좋았던 ** 행동은 ** 두 가지 상황에서 다릅니다 : 당신은 그것을 알아 차리고 이유를 묻습니다. 그러나 정의되지 않은 이유는 없습니다. 하지 마. – pmg

+1

잘못된 메모리를 참조하는 것은 정의되지 않은 동작이므로 '\ n'과는 아무런 관련이 없습니다. – Rohan

+2

'printf()'에 NULL 포인터를 전달하는 것이 좋습니다. 유효한 문자열 등으로 전달하지 마십시오. 거짓말은 눈살을 찌푸 리며, 형벌은 UB가됩니다. – Deduplicator

답변

5

위대한 예가 undefined behaviour입니다. NULL 포인터를 printf에 전달하면 null 끝 바이트 버퍼에 대한 포인터가 필요하며 그 동작은 정의되지 않습니다. 즉, 기계의 고블린 만이 무슨 일이 일어나는지 알 수 있습니다. 때로는 작동하는 것처럼 보일 때가 있습니다. 때로는 오류가 발생하고 때로는 오류가 발생합니다.

이야기의 도덕은 다음과 같습니다. 정의되지 않은 동작을 호출하지 마십시오. printfNULL- 포인터를 전달하지 마십시오.

1

(char*)0을 제공하는 동안 형식 문자열이 printf에 유효한 문자열을 요구하기 때문에 UB을 호출합니다.

+0

thats right printf ("\ n % s", p); 또한 일하고 있습니다. –

0

당신은 자신이 printf()에 NULL 포인터를 전달할 필요가있는 undefined behaviour.what의 훌륭한 예제를 제공합니다. 이름으로 는 더 Kninnug 응답에 지정된 링크에서 읽기
The incorrect codes to which standard forces no requirements

It can even launch mesilles unwillingly if you have sufficient hardware
의 동작입니다 제안한다.

+0

이 이유를 언급 한 사람은 이유를 언급하십시오. – YakRangi

관련 문제