59

C에서 size_t 유형의 변수를 인쇄하려고하지만 size_t이 다른 아키텍처의 다른 변수 유형에 앨리어싱되어있는 것처럼 보입니다. 예를 들어, 하나의 시스템에서 (64 비트) 다음 코드는 경고를 던져하지 않습니다플랫폼 독립적 인 size_t 형식 지정자는?

:
size_t size = 1; 
printf("the size is %ld", size); 

하지만 내 다른 컴퓨터에 (32 비트) 위의 코드는 다음과 같은 경고 메시지가 생성

경고 : 형식 '% ld 개는' '긴 INT *'하지만, 인수 3 을 입력있다 '를 size_t *'나는이 포인터 크기의 차이로 인해 의심

을 입력 기대에 있도록 내 64 비트 시스템 size_tlong int ("%ld")이며, 내 32 비트 컴퓨터에서는 size_t이 다른 유형의 앨리어스입니다.

특별히 size_t의 형식 지정자가 있습니까?

+0

경고 메시지가 코드와 일치하지 않습니다. 경고는 포인터를 언급하고 코드에는 아무 것도 없습니다. 당신은 어딘가에서'&'를 제거 했습니까? – Jens

+0

포인터? 아니요. 포인터에 대한 경고를 얻지 못했습니다. 실제로 어떤 코드를 실행할 때 어떤 경고가 표시되는지에 따라 오류가 발생합니다. 다음 테스트 코드를 사용해보십시오. #include int main() { size_t size = 1; printf ("크기는 % ld", 크기); return 0; } –

+1

참고 항목 [size_t 유형의 변수에 대한 교차 플랫폼 형식 문자열] (http://stackoverflow.com/questions/174612/cross-platform-format-string-for-variables-of-type-size-t) . – legoscia

답변

87

예 다음 z 길이 수정 사용

size_t size = sizeof(char); 
printf("the size is %zd\n", size); // decimal size_t 
printf("the size is %zx\n", size); // hex size_t 

사용할 수있는 다른 길이 수정

이 ( char에 대한) hh 있으며, h ( short 용), l ( long를 들어), ( long long에 대한) ll ( intmax_t에 대해), t ( ptrdiff_t에 대해) 및 L ( long double에 대해)이다. C99 표준의 §7.19.6.1 (7)을 보라.

+0

zd와 zu의 차이점은 무엇입니까? 나는 그 zd 10 진수,하지만 그것을 서명하는 경우 zd 영향을받는 것들을 서명하는 방법입니다. –

+1

이것은'size_t'와'ssize_t'의 차이점입니다; 후자는 거의 사용되지 않습니다. –

+20

이 경우 인수는 부호가 없으므로'% zu'를 사용해야합니다. – caf

25

예, 있습니다. %zu (ANSI C99에 지정된대로)입니다. 길이의 잘못 수정 및 잘못된 형식 변환 지정자 : 따라서 %ldsize_t가 서명되지하는 것으로

size_t size = 1; 
printf("the size is %zu", size); 

는 두 번 잘못입니다. 혹시 궁금한 점이 있으면 %zdssize_t (서명 됨)입니다.

0

MSDN은 Visual Studio가 32 비트 및 64 비트 플랫폼에서 이식 가능한 코드의 "I"접두사를 지원한다고 말합니다.

size_t size = 10; 
printf("size is %Iu", size); 
+3

그것은 MS 규격이며, 표준을 준수하지 않으므로 플랫폼에 독립적입니다 –

관련 문제