为什么当我尝试这样做时:
#include <stdio.h>
int main()
{
printf("Size of int: %d bytes\n",sizeof(int));
return 0;
}
我明白了:
warning: format "%d" expects argmuments of int type, but the second argument is of type "long unsigned int..."
(?)
如果重要,我的操作系统是版本12.4的64位Ubuntu。 编译器是:GNU GCC编译器,IDE是Code :: Blocks。
为了好奇,我在另一台机器上运行相同的代码,运行一个可怜的Win7,结构也是64位,我得到的结果就是那个int的大小,而不是像上面那样的警告。
答案 0 :(得分:9)
这是正确的方法:
printf("Size of int: %zu bytes\n", sizeof(int));
sizeof
运算符生成类型为size_t
的值,%zu
是正确的转换规范,用于打印size_t
类型的值。
如果你的编译器不支持c99或c11,你可以这样做:
printf("Size of int: %lu bytes\n", (unsigned long) sizeof(int));
答案 1 :(得分:0)
尝试:
printf("Size of int: %lu bytes\n", sizeof(int));
答案 2 :(得分:0)
printf("Size of int: %zd bytes\n",sizeof(int))
答案 3 :(得分:0)
sizeof
会返回size_t
类型,在某些情况下会大于int
。由于错误的大小参数被printf
拉出,这会弄乱堆栈。几乎可以肯定,在sizeof
之后打印的任何参数都会看到不正确的结果。
答案 4 :(得分:0)
您可以转换值
printf("Size of int: %d bytes\n", (int)sizeof (int));
答案 5 :(得分:0)
sizeof
会产生size_t
。使用格式说明符“%zu”应该提供正确的格式:
printf("Size of int: "%zu bytes\n", sizeof(int));
此格式说明符 符合C99 如果您没有C99兼容编译器,则可以将sizeof转换为unsigned int并使用“%lu”
printf("Size of int: "%lu bytes\n", (unsigned int)sizeof(int));
如果 ,您使用 visual studios ,根据Microsoft的说法,格式正确size_t的说明符是%Iu
printf("Size of int: "%Iu bytes\n", sizeof(int));