"%d "ожидает аргумент типа "int" , но аргумент 2 имеет тип "long unsigned int" [- Wformat=] [duplicate]
этот вопрос уже есть ответ здесь:
Я продолжаю получать предупреждения компиляции, но я не знаю, как это исправить:
'%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 bytesn", 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 bytesn",
sizeof( unsigned long long ));
printf("nfloat is %d bytes", sizeof( float ));
printf("nA double is %d bytesn", sizeof( double ));
printf("nA long double is %d bytesn", sizeof( long double ));
return 0;
}
3 ответов
sizeof
возвращает size_t
вам нужно использовать %zu
для строки формата вместо %d
. Тип целое число без знака of size_t
может варьироваться (в зависимости от платформы) и не может быть длинный неподписанный int везде, который охвачен в проекте раздела стандарта C99 6.5.3.4
оператор sizeof абзац 4:
значение результата определяется реализацией, а его тип (без знака целочисленный тип) is size_t, определенный В (и других заголовках).
также обратите внимание, что использование неправильного спецификатора формата для printf
неопределенное поведение, которое рассматривается в разделе 7.19.6.1
функция fprintf, и printf
относительно спецификаторов формата говорит:
если спецификация преобразования является недопустимым, поведение неопределено.248) если какой-либо аргумент не правильный тип соответствующая спецификация преобразования, поведение не определено.
обновление
Visual Studio
не поддерживает z
формата:
префиксы длины hh, j, z и t не поддерживаются.
правильный спецификатор формата в этом случае будет %Iu
.
компилятор предупреждает Вас, что вы можете понести потери точности. То есть, спецификатор формата, который вы используете для печати sizeof
, %d
, не способен печатать полный диапазон size_t
. Изменить %d
to %zu
и Ваше предупреждение исчезнет.
У меня была такая же проблема в Linux. та же программа работает без ошибок в windows (означает, что "%d "работал без ошибок), но для linux мне пришлось заменить все "%d " на "%lu " для запуска программы.