2011-12-01 1 views
0

% zu 변환 지정자를 사용하여 10 진수 형식의 포인터 주소를 출력하려고합니다. gcc가 '% zu'형식을 'size_t'형식으로 예상하지만 인수 4가 'long int *'형식 인 경우를 제외하고는 예상대로 실행됩니다. 사용 된 gcc 옵션이 질문에 표시됩니다. gcc는 (-std = c99 이외의) 옵션을 설정하지 않고도 경고합니다. 그러나 clang은 동일한 옵션으로 전혀 경고를 발행하지 않습니다. 이것은 OS X 10.7에 있습니다. 그냥 왜 clang이 경고를 내고 있지 않는지 궁금한가요? gcc는 디버깅/컴파일을위한 clang보다 "더 나은"가 있습니까?gcc -W -Wall -O -pedantic -std = c99 동일한 옵션을 사용하여 clang하십시오.

+1

printf-format 경고가 표준에서 요구하는 것은 아닙니다. 타입 세이프가 아니기 때문에, 궁극적으로는 그것을 올바르게 사용하는 것이 중요합니다. –

+0

그 의미가 있습니다 ... – spinozagl

+0

올바른 형식 지정자가'% p'이고 'void *'에 대한 캐스트가 순서대로 있다는 것을 알고 있다고 생각합니다. –

답변

2

; 당신은

는 일반적으로,이 GCC는보다 더 유용한 경고 메시지를 가지고 그 소리 내 경험이었다 말하기 (심지어 옵션없이) 등 %lu, %u, %hu와 경고가 할 . 이것은 그 경험에 대한 예외입니다. 나는 버그를 제기 할 것이다.

0

캐스팅해야하지만 코드가 size_t가 포인터와 같은 크기가 아닌 컴퓨터에서 실행되는 경우 잘못된 동작을합니다. 아마 잘하지만 ...

이 그 소리에 z 크기의 수정에 구체적으로 표시
printf ("%zu\n", (size_t)my_ptr); 
+0

아니요, size_t로 캐스팅하면 예상대로 포인터 주소가 출력되지 않습니다. 예를 들어 long 배열에 대해 long 포인터를 증가 시키면 size_t로 변환하면 1 바이트 만 다른 주소가 표시됩니다. 내 컴퓨터에서 순차적으로 8 바이트 씩 떨어져 있습니다. – spinozagl

+0

@spinozagl, 맞습니다. –

+0

무엇이 잘못 되었나요? 그 긴 주소는 8 바이트 떨어져 있습니까? – spinozagl

관련 문제