59

我想在C中打印出一个类型为size_t的变量,但看起来size_t在不同的体系结构中被别名为不同的变量类型。例如,一台机器上(64位)以下代码不会引发任何警告:平台无关size_t c中的格式说明符?

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

但我的另一台机器上(32位)的上面的代码产生以下警告消息:

警告:格式“%ld的”需要键入 “长整型*”,但争论3的类型为 “为size_t *”

我怀疑这是由于指针大小的差异,让我64位机器size_t被别名为long int"%ld"),而在我的32位机器size_t上被别名为别的类型。

是否有专门针对size_t的格式说明符?

+0

您的警告信息与代码不符。警告提到指针,你的代码没有任何。你有没有删除一些'&'的地方? – Jens 2012-04-17 14:38:34

+0

指针?不,我没有得到关于指针的任何警告,实际上取决于我运行该代码的机器有时根本没有任何警告。请尝试以下测试代码: #include int main(){ size_t size = 1; printf(“尺寸为%ld”,尺寸); return 0; } – 2012-04-17 16:39:07

+1

另请参见[跨平台格式字符串的变量类型size_t?](http://stackoverflow.com/questions/174612/cross-platform-format-string-for-variables-of-type-size-t) 。 – legoscia 2012-09-21 10:10:18

回答

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 

另一长度改性剂可用是hh(对于char),h(对于short),l(对于long),ll(对于long long) ,j(用于intmax_t),t(用于ptrdiff_t)和L(用于long double)。参见C99标准的§7.19.6.1(7)。

+0

zd和zu有什么区别?我得到的那个zd是十进制的,但它是否被签名,如果是这样的话,zd是如何签名的。 – 2010-01-24 03:51:54

+1

这是'size_t'和'ssize_t'之间的区别;后者很少被使用。 – 2010-01-24 03:53:25

+20

对,所以在这种情况下,你应该使用'%zu',因为参数是无符号的。 – caf 2010-01-24 23:03:57

25

是的,有。它是%zu(按照ANSI C99的规定)。

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

注意size_t是无符号的,因此%ld是双重错误的:错误的长度改性剂和错误的格式转换说明。如果您想知道,%zdssize_t(已签名)。

0

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

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

它是MS特定的,不符合标准,所以它不是平台独立的 – 2016-06-24 07:24:10