2008-09-08 25 views
15

¿Por qué n no es igual a 8 en la siguiente función?Diferentes tamaños de resultados

void foo(char cvalue[8]) 
{ 
    int n = sizeof (cvalue); 
} 

Pero n hace igual a 8 en esta versión de la función:

void bar() 
{ 
    char cvalue[8]; 
    int n = sizeof (cvalue); 
} 

Respuesta

45

Debido a que no se puede pasar arrays enteros como parámetros de la función en C. En realidad estás pasando un puntero lo; los paréntesis son azúcar sintáctico. No hay garantías de que la matriz que está señalando tiene el tamaño 8, ya que podría pasar esta función a cualquier puntero de carácter que desee.

// These all do the same thing 
void foo(char cvalue[8]) 
void foo(char cvalue[]) 
void foo(char *cvalue) 
+3

más como syntactic cianide ... –

1

En el primer ejemplo, cValue como parámetro pasado es en realidad un puntero a una matriz de caracteres y cuando se toma el sizeof() de ello, se obtiene el tamaño del puntero. En el segundo caso, donde lo ha declarado como una variable local, obtiene el tamaño de la matriz completa.

0

El tamaño del parámetro en los sistemas de 32 bits será 4 y en los sistemas de 64 bits compilados con -m64 será 8. Esto se debe a que las matrices se pasan como punteros en las funciones. El puntero es simplemente una dirección de memoria.

14

Las matrices C y C++ no son objetos de primera clase; no puede pasar matrices a funciones, siempre decaen a punteros.

Sin embargo, puede pasar punteros y referencias a matrices. Esto evita que los límites de la matriz se descompongan. Entonces esto es legal:

template<typename T, size_t N> 
void foo(const T(&arr)[N]) 
{ 
    int n = sizeof(arr); 
} 
+2

Usted merece más upmods para su solución inteligente. –

+1

@NickRetallack de acuerdo – Ulterior

+0

Solo hay que tener en cuenta que el ejemplo de la plantilla es C++, no C. C no admite tipos de referencia. – Peter

Cuestiones relacionadas