‘%d’需要类型为’int’的参数,但参数2的类型为’long unsigned int’
我一直收到编译警告,但我不知道如何解决它:
'%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 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; }
sizeof
返回size_t
您需要使用%zu
作为格式字符串而不是%d
。 size_t
的无符号整数的类型可以变化(取决于平台),并且在任何地方都可能不是长unsigned int ,这在草案C99标准部分6.5.3.4
sizeof运算符第4段:
结果的值是实现定义的,其类型(无符号整数类型)是size_t,在(和其他头文件)中定义。
另请注意,对printf
使用错误的格式说明符是未定义的行为,这将在7.19.6.1
节中7.19.6.1
fprintf函数 ,该函数还包含有关格式说明符的printf
:
如果转换规范无效,则行为未定义。 248)如果任何参数不是相应转换规范的正确类型,则行为未定义。
更新
Visual Studio
不支持z
格式说明符 :
不支持hh,j,z和t长度前缀。
在这种情况下,正确的格式说明符是%Iu
。
编译器警告您可能会丢失精度。 也就是说,用于打印sizeof
%d
的格式说明符无法打印整个size_t
范围。 将%d
更改为%zu
,您的警告就会消失。
我在Linux中遇到了同样的问题。 相同的程序在Windows中运行没有错误(意味着’%d’工作没有错误),但对于linux我必须用’%lu’替换所有’%d’来运行程序。