📐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:
double a;
i = sizeof a + 10;inicializa i com 18 na maioria dos computadores, porque a ocupa 8 bytes.
Veja como determinar o número de elementos de um array array:
(sizeof array / sizeof array[0])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:
i = sizeof (double) + 10;é 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:
sizeof (int) -xé interpretado como:
(sizeof (int)) - xSe o que se deseja é:
sizeof ((int) -x)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?