我一直收到编译警告,但我不知道如何解决它:
'%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [
程序运行正常,但我仍然收到编译警告:
/* Sizeof.c--Program to tell byte size of the C variable */
#include <stdio.h>
int main(void) {
printf("\nA Char is %d bytes", sizeof( char ));
printf("\nAn int is %d bytes", sizeof( int ));
printf("\nA short is %d bytes", sizeof( short ));
printf("\nA long is %d bytes", sizeof( long ));
printf("\nA long long is %d bytes\n", sizeof( long long ));
printf("\nAn unsigned Char is %d bytes", sizeof( unsigned char ));
printf("\nAn unsigned int is %d bytes", sizeof( unsigned int));
printf("\nAn unsigned short is %d bytes", sizeof( unsigned short ));
printf("\nAn unsigned long is %d bytes", sizeof( unsigned long ));
printf("\nAn unsigned long long is %d bytes\n",
sizeof( unsigned long long ));
printf("\nfloat is %d bytes", sizeof( float ));
printf("\nA double is %d bytes\n", sizeof( double ));
printf("\nA long double is %d bytes\n", sizeof( long double ));
return 0;
}
答案 0 :(得分:26)
sizeof
返回size_t
您需要使用%zu
作为格式字符串而不是%d
。 size_t
的无符号整数的类型可能会有所不同(取决于平台),并且可能不是 long unsigned int ,这在草案C99标准部分中有所涉及6.5.3.4
sizeof运算符段 4 :
结果的值是实现定义的,它的类型(无符号整数类型) 是size_t,在(和其他标题)中定义。
另请注意,使用printf
的错误格式说明符是未定义的行为,7.19.6.1
fprintf函数部分对此进行了介绍,其中也涵盖了printf
关于格式说明符说:
如果转换规范无效,则行为未定义。 248)如果任何参数不是相应转换规范的正确类型,则行为未定义。
更新
Visual Studio
does not support the z
format specifier:
不支持hh,j,z和t长度前缀。
在这种情况下,正确的格式说明符为%Iu
。
答案 1 :(得分:7)
编译器警告您可能会丢失精度。也就是说,您用于打印sizeof
,%d
的格式说明符无法打印size_t
的全部范围。将%d
更改为%zu
,您的警告就会消失。
答案 2 :(得分:2)
我在Linux中遇到了同样的问题。相同的程序在Windows中运行没有错误(意味着'%d'工作没有错误),但对于linux我必须用'%lu'替换所有'%d'来运行程序。