Operador sizeof
O padrão C economiza palavras ao falar sobre os tamanhos de objetos de cada tipo
na memória. É possível que em uma plataforma um int ocupe 2 bytes, e em outra
ocupe 8. Por isso, existe o operador sizeof para descobrir o tamanho em bytes
de um tipo ou objeto.
A aplicação do operador sizeof pode se dar de duas formas:
sizeof(tipo): Equivale ao tamanho em bytes de um objeto desse tipo.sizeof expressão: Equivale asizeof(tipo)comtiposendo o tipo da expressão. Pode também ser escritosizeof(expressão).
Ambas formas retornam um valor do tipo inteiro sem sinal size_t (definido em
<stddef.h>).
Usos Simples
Um exemplo de uso do operador sizeof é não precisar digitar manualmente o
tamanho de um array para percorrê-lo em um laço for. Os dois trechos abaixo
são equivalentes, porém utilizando sizeof, ao alterar o array a condição não
precisa ser alterada.
int array[10];
/* ... */
// Percorre todos elementos do array
for (size_t i = 0; i < 10; i = i + 1)
/* ... */
int array[10];
/* ... */
// Percorre todos elementos do array
for (size_t i = 0; i < sizeof array / sizeof array[0]; i = i + 1)
/* ... */
A expressão sizeof array / sizeof array[0] resulta no número de elementos no
array após 3 passos:
- Calcular o valor de
sizeof array.arrayé do tipoint[10], portanto o valor ésizeof(int) * 10(pois um array de 10ints é 10 vezes maior que umint). - Calcular o valor de
sizeof array[0].array[0]é um dos elementos do array, portanto seu tipo éint. Isso se tornasizeof(int). - Dividindo
sizeof(int) * 10porsizeof(int)temos o resultado10, que é o número deints no array.
sizeof(char) é sempre 1, portanto o número de elementos em um array de
char pode ser calculado utilizando simplesmente sizeof(array). Utilize essa
versão reduzida com moderação pois pode causar erros caso o tipo armazenado no
array seja alterado por alguma mudança no código.
Quantos Bits Tem Um Byte?
Curiosamente, o padrão ISO não especifica quantos bits há em um byte. A
quantidade de bits em um byte no seu sistema é especificada no valor de
CHAR_BIT (<limits.h>). Atualmente é muito provável que no seu caso esse
valor seja 8.
Referências
- ISO/IEC JTC1/SC22/WG14 N2310:
- 5.2.4.2.1 Sizes of integer types <limits.h>
- 6.5.3.4 The sizeof and _Alignof operators
- 7.19 Common definitions <stddef.h>