13. Tamanho de Tipo
Cada tipo de dado possui um tamanho, que é o número de bytes (veja Armazenamento e Dados) que ele ocupa na memória. Para referenciar esse tamanho em um programa C, usa-se sizeof
. Existem duas formas de utilizá-lo:
sizeof expressão
Essa forma retorna o tamanho da expressão, com base em seu tipo de dado. Ela não calcula o valor da expressão — apenas seu tamanho —, então, se a expressão contiver efeitos colaterais ou chamadas de função, eles não serão executados. Portanto, sizeof
é sempre uma operação em tempo de compilação e não tem custo em tempo de execução.
Não é permitido usar como operando de sizeof
um valor que seja um campo de bits (veja ).
Por exemplo:
define i
como 18 na maioria dos computadores, porque a
ocupa 8 bytes.
Veja como determinar o número de elementos de um array array
:
A expressão sizeof array
retorna o tamanho do array, e não o tamanho de um ponteiro para um elemento. No entanto, se a expressão for um parâmetro de função declarado como array, essa variável na verdade tem tipo de ponteiro (veja ), portanto o resultado será o tamanho desse ponteiro.
sizeof (tipo)
Essa forma retorna o tamanho de tipo. Por exemplo:
é equivalente ao exemplo anterior.
Não é permitido aplicar sizeof
a um tipo incompleto (veja ), nem a void
. Aplicá-lo a um tipo de função retorna 1 no GNU C, o que permite que a adição de um inteiro a um ponteiro de função funcione como desejado (veja ).
Aviso: Ao usar sizeof
com um tipo em vez de uma expressão, é obrigatório escrever parênteses em torno do tipo.
Aviso: Ao aplicar sizeof
ao resultado de um cast (veja ), também é necessário colocar parênteses ao redor da expressão de cast para evitar ambiguidade na gramática da linguagem C. Especificamente:
é interpretado como:
Se o que se deseja é:
deve-se escrever exatamente assim, com os parênteses adicionais.
O tipo do valor retornado por sizeof
é sempre um tipo inteiro sem sinal; qual exatamente depende da máquina. O cabeçalho stddef.h
define o nome size_t
como um alias (typedef
) para esse tipo. Veja .
Atualizado
Isto foi útil?