HOWTO · C

Obter o Tamanho do Array em C

Este tutorial apresenta métodos em C para determinar o tamanho de um array. Aprenda a usar eficazmente o operador sizeof() e explore métodos alternativos como macros e funções. Dominar essas técnicas é essencial para um gerenciamento eficiente de memória e manipulação de arrays na programação em C.

Nesta página

Para um array de tamanho fixo no mesmo escopo, divida o seu tamanho total em bytes pelo tamanho em bytes de um elemento: sizeof array / sizeof array[0]. O resultado é o número de elementos. Dentro de uma função, passe essa contagem separadamente, porque um parâmetro de array é tratado como um ponteiro.

Usar sizeof para contar elementos em um array de tamanho fixo

sizeof retorna um tamanho em bytes. Para um array visível no escopo atual, sizeof values é o tamanho de todo o array, enquanto sizeof values[0] é o tamanho de um elemento. O quociente entre eles fornece a contagem de elementos sem presumir que um int tenha um tamanho específico em bytes.

Este exemplo completo em C conta um array de tamanho fixo e passa o resultado para uma função. Os valores e a chamada da função mostram como adaptar o padrão a outro tipo de elemento ou array.

#include <stdio.h>
#include <stddef.h>

void print_values(const int *values, size_t count)
{
    size_t i;
    printf("Element count: %d\n", (int)count);
    for (i = 0; i < count; ++i) {
        printf("%d ", values[i]);
    }
    putchar('\n');
}

int main(void)
{
    int values[] = {4, 8, 15, 16};
    size_t count = sizeof values / sizeof values[0];

    printf("Array count: %d\n", (int)count);
    print_values(values, count);
    return 0;
}
Array count: 4
Element count: 4
4 8 15 16

Para esta demonstração, a conversão para int é segura porque o array tem quatro elementos. Para uma contagem geral, use um especificador de formato adequado para size_t na biblioteca C de destino.

Por que sizeof fornece o tamanho do ponteiro dentro de uma função

Em uma declaração de parâmetro de função, int values[] é ajustado para int *values. Portanto, sizeof values nessa função mede o ponteiro, e não o array do chamador. Dividir esse valor por sizeof values[0] não recupera o número original de elementos, e o tamanho do ponteiro pode variar conforme a plataforma.

Mantenha o cálculo da contagem do array no escopo onde o array é declarado e, em seguida, passe a contagem para qualquer função que precise dela. Isso se aplica a parâmetros de array comuns, bem como a parâmetros escritos com a sintaxe de ponteiro.

Usar uma macro para arrays no mesmo escopo

Uma macro pode tornar reutilizável o cálculo no mesmo escopo: #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])). Use-a onde array seja um array de fato, como ARRAY_SIZE(values) no escopo que declara values. Quando um array é passado para uma função, a macro enxerga um ponteiro e não consegue determinar o comprimento original do array. Para arrays multidimensionais, a expressão conta os elementos da dimensão mais externa.

Passar a contagem de elementos para uma função

Declare o parâmetro da função como um ponteiro (ou parâmetro de array) e forneça uma contagem size_t separada, como print_values(values, count) faz acima. O chamador calcula a contagem enquanto o array completo está no escopo; a função usa essa contagem como limite do seu loop. Esse padrão funciona para arrays de tamanho fixo e para armazenamento alocado dinamicamente, desde que o chamador forneça o número de elementos. Mantenha o ponteiro e a contagem juntos para que a função processe exatamente os elementos pretendidos.