¿Cómo determino el tamaño de mi matriz en C?
¿Cómo determino el tamaño de mi matriz en C?
Es decir, ¿la cantidad de elementos que puede contener la matriz?
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
a
cambia, 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);
La sizeof
forma 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 sizeof
devolverá 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 size
que 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
Vale la pena señalar que esto sizeof
no 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));