2012-03-01 16 views
6

Duplicar Posible ++:
Sizeof array passed as parameterC Tamaño de la matriz

estoy siendo estúpida con este operador sizeof en C++, ¿tiene alguna idea de por qué es 4 y 12?

void function (int arg[]) { 
     cout<<sizeof(arg)<<endl; // 4 
    } 

    int main() 
    { 
     int array[] = {1, 2, 3}; 
     cout<<sizeof array<<endl; // 12 
     function (array); 
     return 0; 
    } 
+2

[Tamaño de la matriz pasada como parámetro] (http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – Blastfurnace

+0

Véase también http://stackoverflow.com/questions/1641957/is- array-name-a-pointer-in-c y http://stackoverflow.com/questions/720077/calculating-size-of-an-array - esta es una pregunta frecuente. –

Respuesta

23

En main, el nombre array es una matriz para que pueda obtener el tamaño en bytes de la matriz con sizeof. Sin embargo, una matriz se desintegra a un puntero cuando se pasa a una función, por lo que obtienes sizeof(int*) dentro de la función.

Tenga en cuenta que la adopción de un argumento en forma de T arg[] es exactamente lo mismo que tomar el argumento como T* arg. Entonces su función es el equivalente exacto de

void function(int* arg) { 
    cout << sizeof(arg) << endl; 
} 
0

Su programa a continuación es similar al siguiente.

void function (int arg[]) { 
    cout<<sizeof(arg)<<endl; // 4 
} 

El siguiente programa imprime el tamaño del puntero.

void function (int *arg) { 
    cout<<sizeof(arg)<<endl; // 4 
} 
4
void function (int arg[]) // or void function (int arg[N]) 

es equivalente a

void function (int *arg) 

por lo tanto,

sizeof(arg) == sizeof(int*) 

Si tiene la intención de pasar matriz misma, entonces C++ le ofrece a pasarlo por referencia:

void function (int (&arg)[3]) 
       // ^^^ pass by reference 

Ahora,

sizeof(arg) == sizeof(int[3]) 
-1

matrices son solo enlaces a una cantidad arbitraria de memoria. Si realiza sizeof (matriz) devolverá el tamaño de un puntero: 4 bytes en sistemas de 32 bits y 8 bytes en sistemas de 64 bits (si el programa está compilado como 64 bits).

Esta es la misma razón por la que tiene que terminar de forma nula sus cadenas en c/C++ - para denotar el final de la matriz.

En pocas palabras, usted tiene la pista de mantener el tamaño de sus matrices usted mismo. Si asigna una matriz de 40 bytes, debe asegurarse de no acceder nunca a la matriz por encima del 40 ° índice (es decir, matriz [39]).

Espero que esto ayude.

+0

Si las matrices son simplemente punteros, ¿cómo entra 'main' imprime 12? – fredoverflow

+0

No puedo estar 100% seguro, pero supongo que es porque su matriz es estática. Su tamaño se determina en tiempo de compilación, a diferencia de la memoria dinámica.Sizeof() puede funcionar en arreglos estáticos, pero puedo asegurarle que no funcionará en las matrices que se asignan dinámicamente durante el tiempo de ejecución. – Gogeta70

+1

Las matrices no son simplemente punteros. – xaxxon