c++ - funcion - sizeof() c
Diferentes tamaƱos de resultados (4)
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.
¿Por qué n
no es igual a 8
en la siguiente función?
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);
}
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);
}
Porque no puede pasar matrices enteras como parámetros de función en C. En realidad, le está pasando un puntero; 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)
En el primer ejemplo, cvalue como parámetro pasado es en realidad solo un puntero a una matriz de caracteres y cuando se toma el tamaño de sizeof()
, 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.