与平台无关的size_t在c中的格式说明符?


86

我想打印出size_tC中类型的变量,但它似乎size_t是别名,它是不同体系结构上的不同变量类型。例如,在一台计算机(64位)上,以下代码不会引发任何警告:

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

但是在我的另一台计算机(32位)上,以上代码会产生以下警告消息:

警告:格式'%ld'期望类型为'long int *',但是参数3的类型为'size_t *'

我怀疑这是由于指针大小的差异所致,因此在我的64位计算机size_t上别名为long int"%ld"),而在我的32位计算机size_t上别名为另一种类型。

是否有专门用于格式的说明符size_t


您的警告消息与代码不匹配。警告中提到了指针,您的代码没有任何指针。你有没有移走一些东西&
詹斯2012年

指针?不,我不会收到有关指针的任何警告,实际上,这取决于我在哪台计算机上运行该代码,有时我根本不会收到任何警告。请尝试以下测试代码:#include <stdio.h> int main(){size_t size = 1; printf(“大小为%ld”,大小);返回0; }
Ethan Heilman


1
@EthanHeilman他指的是您的警告warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'可能应该在什么时候说的事实warning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'scanf()收到这些警告时,您可能正在使用它来代替吗?
RastaJedi

Answers:


123

是:使用z长度修饰符:

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

可用的其他长度修饰符是hh(for char),h(for short),l(for long),ll(for long long),j(for intmax_t),t(for ptrdiff_t)和L(for long double)。请参阅C99标准的§7.19.6.1(7)。


zd和zu有什么区别?我知道zd是十进制的,但是它是带符号的,如果是这样的话,被签名的zd会如何影响事情。
伊桑·海尔曼

1
这是asize_t和an之间的区别ssize_t;很少使用后者。
亚当·罗森菲尔德

26
是的,在这种情况下,您应该使用%zu,因为参数是无符号的。
caf 2010年

可用的其他选项在printf手册页中进行了说明:linux.die.net/man/3/printf
INS

9
@detly:不,z长度修饰符不是C89 / C90的一部分。如果您要使用符合C89的代码,则可以尽力而为,unsigned long并改用llength修饰符,例如printf("the size is %lu\n", (unsigned long)size);;。同时支持C89和size_t更大的系统要long复杂得多,并且需要使用许多预处理器宏。
亚当·罗森菲尔德2014年

45

就在这里。它是%zu(按ANSI C99中的规定)。

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

请注意,这size_t是无符号的,因此%ld是双重错误:错误的长度修饰符和错误的格式转换说明符。如果您想知道,%zd是用于ssize_t(已签名)。


1

MSDN表示,Visual Studio支持在32位和64位平台上移植的代码的“ I”前缀。

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

6
它是针对MS的,不符合标准,因此不是平台独立的
phuclv

@phuclv确实。如果它确实说出了(如答案所暗示的那样)“便携”,那就比我对MS的了解还要糟糕。并不是说这会让我感到惊讶...我不是一个不赞成投票的人,因为有人努力尝试回答一些问题,但是这个答案仍然是错误的。嗯,我想我在“便携式”中理解了这个想法。必须说它适用于32位和64位。但是,当然可以。
Pryftan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.