‘%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作为格式字符串而不是%dsize_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’来运行程序。