2014-04-16 22 views
3

为什么当我尝试这样做:无法打印的sizeof一个符号int类型

#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

我不认为微软试图解析一个'printf'的格式来查看参数是否正确。 –

回答

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)); 
+0

+1教我关于'%zu',以前没见过那个。 –

+0

+1在这里,并感谢您的有益评论。 – ryyker

0

尝试:

printf("Size of int: %lu bytes\n", sizeof(int)); 
+1

这对于像Windows这样的LLP64系统来说是不正确的(实际上是不安全的),在这种系统中,long仍然是3​​2位。如果需要安全地运行,您必须将sizeof(int)的结果转换为无符号long。 – TripShock

0
printf("Size of int: %zd bytes\n",sizeof(int)) 
+1

“zd”不正确,因为它意味着签名类型。 – TripShock

0

sizeof返回size_t类型,在某些情况下会比int大。由于错误的大小参数被printf取消,这会使堆栈变得混乱。在sizeof之后打印的任何参数几乎肯定会看到不正确的结果。

+0

那么,什么是/解决方案? – user2864740

+0

@ user2864740,请使用在此问题的其他答案中找到的正确格式代码。 –

0

,就可以把价值

printf("Size of int: %d bytes\n", (int)sizeof (int)); 
0

sizeof产生size_t。使用格式说明“%族”应提供适当的格式:

printf("Size of int: "%zu bytes\n", sizeof(int)); 

此格式说明符C99兼容
如果你没有C99兼容的编译器,你可以投的sizeof为unsigned int和使用 “%鲁”

printf("Size of int: "%lu bytes\n", (unsigned int)sizeof(int));  

但是如果,您使用的visual studios,根据微软,size_t的正确格式说明符是%Iu

printf("Size of int: "%Iu bytes\n", sizeof(int)); 
+2

'sizeof'不是一个宏,而是一个运算符。由于它不是一个函数,它不会返回*。它产生的值的类型始终是'size_t',永远不会'ssize_t'。 – ouah

+0

@ouah - 编辑删除这些问题。不过,我想听听你说的区分术语“回报”和“收益率”。谢谢。 – ryyker

+0

@rykker我没有downvote,但这仍然是错误的。 'sizeof'不是一个宏。此外,不将'sizeof'强制转换为'unsigned long'可能会调用未定义的行为,因为在某些实现中'size_t'可以是'unsigned long long'的别名。 – ouah