¿Cómo determino el tamaño de mi matriz en C?

Resuelto Mark Harrison asked hace 16 años • 25 respuestas

¿Cómo determino el tamaño de mi matriz en C?

Es decir, ¿la cantidad de elementos que puede contener la matriz?

Mark Harrison avatar Sep 01 '08 13:09 Mark Harrison
Aceptado

Resumen ejecutivo:

int a[17];
size_t n = sizeof(a)/sizeof(a[0]);

Respuesta completa:

Para determinar el tamaño de su matriz en bytes, puede utilizar el sizeof operador:

int a[17];
size_t n = sizeof(a);

En mi computadora, los enteros tienen 4 bytes de longitud, por lo que n es 68.

Para determinar la cantidad de elementos en la matriz, podemos dividir el tamaño total de la matriz por el tamaño del elemento de la matriz. Podrías hacer esto con el tipo, así:

int a[17];
size_t n = sizeof(a) / sizeof(int);

y obtenga la respuesta adecuada (68/4 = 17), pero si el tipo acambia, tendría un error desagradable si olvida cambiarlo sizeof(int)también.

Entonces, el divisor preferido es sizeof(a[0])o su equivalente sizeof(*a), el tamaño del primer elemento de la matriz.

int a[17];
size_t n = sizeof(a) / sizeof(a[0]);

Otra ventaja es que ahora puedes parametrizar fácilmente el nombre de la matriz en una macro y obtener:

#define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))

int a[17];
size_t n = NELEMS(a);
Mark Harrison avatar Sep 01 '2008 06:09 Mark Harrison

La sizeofforma es la correcta si se trata de matrices que no se reciben como parámetros. Una matriz enviada como parámetro a una función se trata como un puntero, por lo que sizeofdevolverá el tamaño del puntero, en lugar del de la matriz.

Por lo tanto, este método no funciona dentro de las funciones. En su lugar, pase siempre un parámetro adicional size_t sizeque indique el número de elementos de la matriz.

Prueba:

#include <stdio.h>
#include <stdlib.h>

void printSizeOf(int intArray[]);
void printLength(int intArray[]);

int main(int argc, char* argv[])
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6 };

    printf("sizeof of array: %d\n", (int) sizeof(array));
    printSizeOf(array);

    printf("Length of array: %d\n", (int)( sizeof(array) / sizeof(array[0]) ));
    printLength(array);
}

void printSizeOf(int intArray[])
{
    printf("sizeof of parameter: %d\n", (int) sizeof(intArray));
}

void printLength(int intArray[])
{
    printf("Length of parameter: %d\n", (int)( sizeof(intArray) / sizeof(intArray[0]) ));
}

Salida (en un sistema operativo Linux de 64 bits):

sizeof of array: 28
sizeof of parameter: 8
Length of array: 7
Length of parameter: 2

Salida (en un sistema operativo Windows de 32 bits):

sizeof of array: 28
sizeof of parameter: 4
Length of array: 7
Length of parameter: 1
Elideb avatar Apr 27 '2012 11:04 Elideb

Vale la pena señalar que esto sizeofno ayuda cuando se trata de un valor de matriz que se ha descompuesto a un puntero: aunque apunta al inicio de una matriz, para el compilador es lo mismo que un puntero a un solo elemento de esa matriz. . Un puntero no "recuerda" nada más sobre la matriz que se utilizó para inicializarlo.

int a[10];
int* p = a;

assert(sizeof(a) / sizeof(a[0]) == 10);
assert(sizeof(p) == sizeof(int*));
assert(sizeof(*p) == sizeof(int));
Magnus Hoff avatar Sep 01 '2008 06:09 Magnus Hoff