HOWTO · C
Cómo obtener el tamaño del array en C
Este tutorial presenta métodos en C para determinar el tamaño de un array. Aprenda a usar eficazmente el operador sizeof() y explore métodos alternativos como macros y funciones. Dominar estas técnicas es esencial para una gestión eficiente de la memoria y el manejo de arrays en la programación en C.
En esta página
Para un array de tamaño fijo en el mismo ámbito, divida su tamaño total en bytes entre el tamaño en bytes de un elemento: sizeof array / sizeof array[0]. El resultado es el número de elementos. Dentro de una función, pase ese recuento por separado, porque un parámetro de array se trata como un puntero.
Usar sizeof para contar elementos en un array de tamaño fijo
sizeof devuelve un tamaño en bytes. Para un array visible en el ámbito actual, sizeof values es el tamaño de todo el array, mientras que sizeof values[0] es el tamaño de un elemento. Su cociente da el número de elementos sin suponer que un int tenga un tamaño en bytes concreto.
Este ejemplo completo en C cuenta un array de tamaño fijo y pasa el resultado a una función. Los valores y la llamada a la función muestran cómo adaptar el patrón a otro tipo de elemento u otro 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 demostración, la conversión a int es segura porque el array tiene cuatro elementos. Para un recuento general, use un especificador de formato adecuado para size_t en la biblioteca C de destino.
Por qué sizeof da el tamaño del puntero dentro de una función
En la declaración de un parámetro de función, int values[] se ajusta a int *values. Por lo tanto, sizeof values en esa función mide el puntero, no el array del llamante. Dividir ese valor entre sizeof values[0] no recupera el número original de elementos, y el tamaño del puntero puede variar según la plataforma.
Mantenga el cálculo del recuento del array en el ámbito donde se declara el array y, después, pase el recuento a cualquier función que lo necesite. Esto se aplica a los parámetros de array ordinarios, así como a los parámetros escritos con sintaxis de puntero.
Usar una macro para arrays en el mismo ámbito
Una macro puede hacer reutilizable el cálculo en el mismo ámbito: #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])). Úsela donde array sea un array real, como ARRAY_SIZE(values) en el ámbito que declara values. Cuando un array se pasa a una función, la macro ve un puntero y no puede determinar la longitud original del array. En arrays multidimensionales, la expresión cuenta los elementos de la dimensión externa.
Pasar el recuento de elementos a una función
Declare el parámetro de la función como puntero (o parámetro de array) y proporcione un recuento size_t por separado, como hace print_values(values, count) arriba. El llamante calcula el recuento mientras el array completo está en el ámbito; la función usa ese recuento como límite de su bucle. Este patrón funciona para arrays de tamaño fijo y para almacenamiento asignado dinámicamente, siempre que el llamante proporcione el número de elementos. Mantenga juntos el puntero y el recuento para que la función procese exactamente los elementos previstos.