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)
comtipo
sendo 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 10int
s é 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) * 10
porsizeof(int)
temos o resultado10
, que é o número deint
s 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>