¿Por qué una C-Array tiene un tamaño de valor () incorrecto cuando se pasa a una función?

Ejemplo completo:

#include  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 la misma matriz en la función produce resultados extraños. Falta un elemento. ¿Por qué?

Cuando pasa una matriz a una función en C, la matriz se descompone en un puntero a su primer elemento. Cuando usa sizeof en el parámetro, está tomando el tamaño del puntero, no la matriz en sí.

Si necesita la función para conocer 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 un puntero), el truco sizeof(point)/sizeof(point[0]) no funciona para una matriz asignada dinámicamente, solo una matriz asignada en la stack.

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

Además, es importante comprender que sizeof se evalúa en tiempo de comstackción . Como ese es el caso, no tiene sentido esperar resultados diferentes en test() según lo que se pasó. El sizeof cálculo se realizó cuando se compiló la función.

Porque, cuando se pasa, solo se pasa el puntero a la matriz.

Su pregunta también se responde en las Preguntas frecuentes de progtwigción de The C. Pregunta 6.21.

Porque en C, C ++ y Objective-C, las funciones no pueden tener parámetros de matriz. Solo pueden tener parámetros que se parecen a los parámetros de la matriz, pero no lo son . En tu ejemplo,

 void test(int arr[]) 

el comstackdor ve “hay un parámetro que se parece a una matriz de int”, y reemplaza ese parámetro con un “puntero a int”. Entonces la función que escribiste es absolutamente, cien por ciento, idéntica a

 void test (int* arr) 

Por lo tanto, dentro de la función sizeof (arr) le dará el tamaño de un “puntero a int”.

Porque sizeof () NO te dice el tamaño de una matriz en C. Hace algo completamente diferente.

tamaño de referencia de C ++