Pergunta

Quero imprimir uma variável do tipo size_t em C, mas parece que size_t tem alias para diferentes tipos de variáveis ​​em diferentes arquiteturas.Por exemplo, em uma máquina (64 bits), o código a seguir não gera nenhum aviso:

size_t size = 1;
printf("the size is %ld", size);

mas na minha outra máquina (32 bits) o código acima produz a seguinte mensagem de aviso:

aviso:formato '%ld' espera tipo 'long int *', mas o argumento 3 tem tipo 'size_t *'

Suspeito que isso se deva à diferença no tamanho do ponteiro, de modo que na minha máquina de 64 bits size_t é alias de um long int ("%ld"), enquanto na minha máquina de 32 bits size_t é alias para outro tipo.

Existe um especificador de formato específico para size_t?

Foi útil?

Solução

Sim:use o z modificador de comprimento:

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size);  // hex size_t

Os outros modificadores de comprimento disponíveis são hh (para char), h (para short), l (para long), ll (para long long), j (para intmax_t), t (para ptrdiff_t), e L (para long double).Consulte §7.19.6.1 (7) da norma C99.

Outras dicas

Sim existe.Isso é %zu (conforme especificado em ANSI C99).

size_t size = 1;
printf("the size is %zu", size);

Observe que size_t não está assinado, portanto %ld está duplamente errado:modificador de comprimento errado e especificador de conversão de formato errado.Caso você esteja se perguntando, %zd é para ssize_t (que está assinado).

MSDN, diz que o Visual Studio oferece suporte ao prefixo “I” para código portátil em plataformas de 32 e 64 bits.

size_t size = 10;
printf("size is %Iu", size);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top