¿Por qué un C-Array tiene un valor sizeof() incorrecto cuando se pasa a una función? [duplicar]
Ejemplo completo:
#include <stdio.h>
void test(int arr[]) {
int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
printf("%d\n", arrSize); // 2 (wrong?!)
}
int main (int argc, const char * argv[]) {
int point[3] = {50, 30, 12};
int arrSize = (int)(sizeof(point) / sizeof(point[0]));
printf("%d\n", arrSize); // 3 (correct :-) )
test(point);
return 0;
}
Antes de pasarlo a una función, sizeof me da el valor correcto. Hacer exactamente lo mismo en exactamente la misma matriz en la función produce resultados extraños. Falta un elemento. ¿Por qué?
Cuando pasas una matriz a una función en C, la matriz se descompone en un puntero a su primer elemento. Cuando usa sizeof
el parámetro, está tomando el tamaño del puntero, no la matriz en sí.
Si necesita que la función sepa el tamaño de la matriz, debe pasarla como un parámetro separado:
void test(int arr[], size_t elems) {
/* ... */
}
int main(int argc, const char * argv[]) {
int point[3] = {50, 30, 12};
/* ... */
test(point, sizeof(point)/sizeof(point[0]));
/* ... */
}
También tenga en cuenta que, por una razón similar (tomando el sizeof
puntero a), el sizeof(point)/sizeof(point[0])
truco no funciona para una matriz asignada dinámicamente, solo una matriz asignada en la pila.
Debido a que la matriz se descompone en un puntero cuando se pasa como argumento de función, sizeof
le proporciona 4 y 8 para plataformas de 32 y 64 bits respectivamente.
Además, es importante comprender que sizeof
se evalúa en tiempo de compilación . Dado que ese es el caso, no tiene sentido esperar resultados diferentes test()
dependiendo de lo que se pasó. El sizeof
cálculo se realizó cuando se compiló la función.