Calcular o tamanho de um vetor

Em diversas situações de manipulação de um vetor é preciso saber o tamanho desse vetor (saber quantos elementos cabem no vetor) para a operação. Nessas situações é comum ter uma variável que recebe o tamanho do vetor, ou que é incrementada conforme valores são fornecidos. Mas existem situações na qual não se tem esse valor ou é melhor descobrir esse valor ou invés de solicitar (como eu exemplifico mais adiante).

Considerando inicialmente descobrir o tamanho do vetor quando esse vetor é um vetor de caracteres (uma string). Para as strings existe uma função que retorna o tamanho da string, que é a função strlen(). Para essa função, basta informar o vetor de caracteres e ela retorna a quantidade de caracteres, embora isso não seja realmente o tamanho do vetor (o tamanho do texto armazenado pode ser menor do que o tamanho do vetor). O código abaixo ilustra a utilização da strlen().

#include <stdio.h>

int main() {
    char nome[] = "benjamin";
    int len = strlen(nome);

    printf("%i", len);
}

O código abaixo é o código que realmente retorna o tamanho do vetor, seja ele de caracteres ou de valores numéricos. No código eu deixo comentada a linha 5 com o cálculo sizeof(var)/sizeof(int). Isso porque eu prefiro o cálculo feito na linha 6, embora seja mais fácil de explicar com o cálculo que não utilizei.

A função sizeof(var) retorna o tamanho alocado na memória para aquela variável de vetor var. Ou seja, essa função sozinha não retorna quantos elementos cabem no vetor e sim número de bytes que a variável ocupa. Por isso é feita a divisão por sizeof(int). Uma vez que o vetor var é um vetor de inteiros, saber quantos bytes ocupa um inteiro fará com que o resultado da divisão seja a quantidade de elementos do vetor. Eu prefiro utilizar como denominador a chamada da função sizeof(var[0]) (como feito na linha 6) porque ela independe de saber qual o tipo da variável na declaração do vetor. Como o resultado é o mesmo, não se corre o risco de precisar alterar o tipo de vetor e esquecer de alterar o tipo no denominador.

#include <stdio.h>

int main() {
    int var[] = {1, 2, 3, 4, 5, 0};
    //int len = sizeof(var)/sizeof(int);
    int len = sizeof(var)/sizeof(var[0]);

    printf("%i", len);
}

Acho que o uso mais comum de precisar saber o tamanho do vetor está associado com a elaboração de funções. Na função zeraVetor(), apresentada abaixo, é solicitada como parâmetros o vetor em si e o tamanho desse vetor. Ou seja, para chamar essa função será sempre necessário fornecer esses dois parâmetros. Considerando a necessidade de zerar um vetor chamado var com 9 posições, a chamada da função fica: zeraVetor1(var, 9);

Observe que na função zeraVetor(), a declaração do vetor passado para parâmetro não informa qual o tamanho do vetor. Isso faz com que essa função possa ser utilizada para zerar valores do vetor de qualquer tamanho, sendo o tamanho especificado como parâmetro.

void zeraVetor(float vetor[], int tam) {
    int i;
    for (i=0; i<tam; i++) {
        vetor[i] = 0;
    }
}

Sabendo do uso da função sizeof(), poderia ser considerado calcular o tamanho do vetor dentro da função, não sendo necessário informar o tamanho do vetor como parâmetro. A construção dessa possibilidade é mostrada na função zeraVetor_errado() definida a seguir. O nome dela já dá um spoiler de que a forma utilizada não funciona, mas vejamos o motivo de não funcionar. Veja que, em teoria, a expressão tam = sizeof(vetor)/sizeof(vetor[0]) presente na função deveria calcular o tamanho do vetor. Embora isso seja possível se o cálculo fosse feito na função onde o vetor foi definido (como foi feito na função main() no segundo código apresentado nessa minha postagem), na passagem do vetor para uma função isso não ocorre.

void zeraVetor_errado(float vetor[]) {
    int i, tam = sizeof(vetor)/sizeof(vetor[0]);
    for (i=0; i<tam; i++) {
        vetor[i] = 0;
    }
}

A passagem de um vetor para função é realizada sempre por referência, ou seja, é realizada uma passagem por referência. O código abaixo é uma forma de passar o vetor para uma função e mostra o uso específico do parâmetro como um ponteiro. Sendo assim, não se passa um vetor inteiro para uma função e sim apenas o ponteiro para o primeiro elemento do vetor. Com isso, o valor retornado pela função sizeof(vetor) será o valor 4 (se o Sistema Operacional do computador for de 32 bits) ou 8 (para computadores 64 bits). Ou seja, não tem como a função conseguir calcular sozinha o tamanho do vetor.

void zeraVetor(float *vetor, int tam) {
    int i;
    for (i=0; i<tam; i++) {
        vetor[i] = 0;
    }
}

Sendo assim, a determinação do tamanho do vetor/array deve ser feita/calculada na função onde o array é criado e passado por referência para a função. O código abaixo faz isso, sendo na função main() declarado o vetor e calculado seu tamanho (linha 12 e 13, respectivamente) e depois chamada função zeravetor() (linha 15) que recebe o vetor e seu tamanho para zerar todos os valores desse vetor. Apenas para reforçar, as linhas 3 e 4 são equivalentes e gerariam o mesmo resultado como cabeçalho da função.

#include <stdio.h>

//void zeraVetor(float *vetor, int tam) {
void zeraVetor(float vetor[], int tam) {
    int i;
    for (i=0; i<tam; i++) {
        vetor[i] = 0;
    }
}

int main() {
    int var[] = {1, 2, 3, 4, 5, 0};
    int len = sizeof(var)/sizeof(var[0]);

    zeraVetor(var, len);

    int i;
    for (i=0; i<len; i++) {
        printf("%i ", var[i]);
    }
}
Share

2 opiniões sobre “Calcular o tamanho de um vetor

  1. Rogerns

    Muito bom, bem esclarecido. Obrigado!

     
    Reply
  2. Edivan Figueiredo Braga

    Eu estou tentando fazer um código pra ler o n° de caracteres de uma string, mas não estrou conseguindo.

     
    Reply

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.