98

我想size_t在 C 中打印出一个类型的变量,但它似乎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

4

3 回答 3

133

是:使用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)。

于 2010-01-24T03:49:24.153 回答
48

就在这里。它是%zu(在 ANSI C99 中指定)。

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

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

于 2014-03-01T13:24:06.047 回答
1

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

size_t size = 10;
printf("size is %Iu", size);
于 2015-10-14T19:03:33.927 回答