¿Por qué un C-Array tiene un valor sizeof() incorrecto cuando se pasa a una función? [duplicar]

Resuelto dontWatchMyProfile asked hace 14 años • 6 respuestas

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é?

dontWatchMyProfile avatar Jun 01 '10 20:06 dontWatchMyProfile
Aceptado

Cuando pasas una matriz a una función en C, la matriz se descompone en un puntero a su primer elemento. Cuando usa sizeofel 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 sizeofpuntero a), el sizeof(point)/sizeof(point[0])truco no funciona para una matriz asignada dinámicamente, solo una matriz asignada en la pila.

Nick Meyer avatar Jun 01 '2010 13:06 Nick Meyer

Debido a que la matriz se descompone en un puntero cuando se pasa como argumento de función, sizeofle proporciona 4 y 8 para plataformas de 32 y 64 bits respectivamente.

Nikolai Fetissov avatar Jun 01 '2010 13:06 Nikolai Fetissov

Además, es importante comprender que sizeofse 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 sizeofcálculo se realizó cuando se compiló la función.

tomlogic avatar Jun 01 '2010 14:06 tomlogic