size_t Format specifiers in c?
来源:互联网 发布:职场鸡汤 知乎 编辑:程序博客网 时间:2024/06/03 05:14
I want to print out a variable of type size_t
in C but it appears that size_t
is aliased to different variable types on different architectures. For example, on one machine (64-bit) the following code does not throw any warnings:
size_t size = 1;printf("the size is %ld", size);
but on my other machine (32-bit) the above code produces the following warning message:
warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
I suspect this is due to the difference in pointer size, so that on my 64-bit machine size_t
is aliased to a long int
("%ld"
), whereas on my 32-bit machine size_t
is aliased to another type.
Is there a format specifier specifically for size_t
?
3 Answers
Yes: use the z
length modifier:
size_t size = sizeof(char);printf("the size is %zd\n", size); // decimal size_tprintf("the size is %zx\n", size); // hex size_t
The other length modifiers that are available are hh
(for char
), h
(for short
), l
(for long
), ll
(for long long
), j
(for intmax_t
), t
(for ptrdiff_t
), and L
(for long double
). See §7.19.6.1 (7) of the C99 standard.
size_t
and an ssize_t
; the latter is seldomly used. – Adam Rosenfield Jan 24 '10 at 3:53%zu
, because the argument is unsigned. – caf Jan 24 '10 at 23:03z
length modifier is not part of C89/C90. If you're aiming for C89-compliant code, the best you can do is cast to unsigned long
and use the l
length modifier instead, e.g. printf("the size is %lu\n", (unsigned long)size);
; supporting both C89 and systems with size_t
larger than long
is trickier and would require using a number of preprocessor macros. – Adam Rosenfield Mar 25 '14 at 6:01Yes, there is. It is %zu
(as specified in ANSI C99).
size_t size = 1;printf("the size is %zu", size);
Note that size_t
is unsigned, thus %ld
is double wrong: wrong length modifier and wrong format conversion specifier. In case you wonder, %zd
is for ssize_t
(which is signed).
MSDN, says that Visual Studio supports the "I" prefix for code portable on 32 and 64 bit platforms.
size_t size = 10;printf("size is %Iu", size);
I want to print out a variable of type size_t
in C but it appears that size_t
is aliased to different variable types on different architectures. For example, on one machine (64-bit) the following code does not throw any warnings:
size_t size = 1;printf("the size is %ld", size);
but on my other machine (32-bit) the above code produces the following warning message:
warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
I suspect this is due to the difference in pointer size, so that on my 64-bit machine size_t
is aliased to a long int
("%ld"
), whereas on my 32-bit machine size_t
is aliased to another type.
Is there a format specifier specifically for size_t
?
&
somewhere? – Jens Apr 17 '12 at 14:38warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
when it probably should be saying warning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Were you maybe using scanf()
instead when you got these warnings? – RastaJedi Aug 20 at 19:043 Answers
Yes: use the z
length modifier:
size_t size = sizeof(char);printf("the size is %zd\n", size); // decimal size_tprintf("the size is %zx\n", size); // hex size_t
The other length modifiers that are available are hh
(for char
), h
(for short
), l
(for long
), ll
(for long long
), j
(for intmax_t
), t
(for ptrdiff_t
), and L
(for long double
). See §7.19.6.1 (7) of the C99 standard.
size_t
and an ssize_t
; the latter is seldomly used. – Adam Rosenfield Jan 24 '10 at 3:53%zu
, because the argument is unsigned. – caf Jan 24 '10 at 23:03z
length modifier is not part of C89/C90. If you're aiming for C89-compliant code, the best you can do is cast to unsigned long
and use the l
length modifier instead, e.g. printf("the size is %lu\n", (unsigned long)size);
; supporting both C89 and systems with size_t
larger than long
is trickier and would require using a number of preprocessor macros. – Adam Rosenfield Mar 25 '14 at 6:01Yes, there is. It is %zu
(as specified in ANSI C99).
size_t size = 1;printf("the size is %zu", size);
Note that size_t
is unsigned, thus %ld
is double wrong: wrong length modifier and wrong format conversion specifier. In case you wonder, %zd
is for ssize_t
(which is signed).
MSDN, says that Visual Studio supports the "I" prefix for code portable on 32 and 64 bit platforms.
size_t size = 10;printf("size is %Iu", size);
&
somewhere? – Jens Apr 17 '12 at 14:38warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
when it probably should be sayingwarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Were you maybe usingscanf()
instead when you got these warnings? – RastaJedi Aug 20 at 19:04