我想在C中打印出一个类型为size_t的变量,但似乎size_t在不同的体系 struct 上被别名为不同的变量类型.例如,在一台机器(64位)上,以下代码不会引发任何警告:

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

但在我的另一台机器(32位)上,上述代码会生成以下警告消息:

警告:格式"%ld"需要类型

我怀疑这是由于指针大小的不同,因此在我的64位机器上,size_t别名为long int("%ld"),而在我的32位机器上,size_t别名为另一种类型.

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

推荐答案

是:使用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(适用于char)、h(适用于short)、l(适用于long)、ll(适用于long long)、j(适用于intmax_t)、t(适用于ptrdiff_t)和L(适用于long double).参见C99标准的§7.19.6.1(7).

C++相关问答推荐

由于未签名int导致的运行时错误"

如何确保内存分配在地址附近?

你能用自己的地址声明一个C指针吗?

了解一些CLIPS原语数据类型

如何使用Python C API实现多线程程序?

有没有更简单的方法从用户那里获取数据类型来计算结果

向上强制转换C中的数值类型总是可逆的吗?

S将C语言宏定义为自身的目的是什么?(在glibc标题中看到)

是否需要包括<;errno.h>;才能使用perror?

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

#定义SSL_CONNECTION_NO_CONST

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

将数组插入数组

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

发送和接收的消息中的Unix域套接字不匹配

Linux/C:带有子进程的进程在添加waitid后都挂起

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

struct 中的qsort,但排序后的 struct 很乱

模仿 memmove 的行为

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?