‘% d’ attend un argument de type ‘int’, mais l’argument 2 a le type ‘long unsigned int’

Je continue à recevoir des avertissements de compilation mais je ne sais pas comment résoudre ce problème:

'%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [ 

Le programme fonctionne bien mais je reçois toujours les avertissements de compilation:

 /* 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 renvoie size_t vous devez utiliser %zu pour la chaîne de format au lieu de %d . Le type d’ entier non signé de size_t peut varier (en fonction de la plate-forme) et peut ne pas être long unsigned int partout, comme 6.5.3.4 dans le projet de norme C99, section 6.5.3.4 .

La valeur du résultat est définie par l’implémentation et son type (un type entier non signé) est size_t, défini dans (et d’autres en-têtes).

Notez également que l’utilisation d’un spécificateur de format incorrect pour printf correspond à un comportement non défini, qui est 7.19.6.1 dans la section 7.19.6.1 La fonction 7.19.6.1 , qui couvre également printf par rapport aux spécificateurs de format, indique:

Si une spécification de conversion n’est pas valide, le comportement n’est pas défini. 248) Si l’un des arguments n’est pas du type correct pour la spécification de conversion correspondante, le comportement est indéfini.

Mettre à jour

Visual Studio ne prend pas en charge le spécificateur de format z :

Les préfixes de longueur hh, j, z et t ne sont pas pris en charge.

le spécificateur de format correct dans ce cas serait %Iu .

Le compilateur vous avertit que vous pourriez subir une perte de précision. En d’autres size_t , le spécificateur de format que vous utilisez pour imprimer une sizeof , %d , n’est pas capable d’imprimer la plage complète de size_t . Changez %d en %zu et votre avertissement disparaîtra.

J’ai eu le même problème sous Linux. le même programme fonctionne sans erreur dans Windows (signifie ‘% d’ a fonctionné sans erreur), mais pour Linux, je devais remplacer tous les ‘% d’ par ‘% lu’ pour exécuter le programme.