2012-03-01 8 views
6

Eventuali duplicati:
Sizeof array passed as parameterC++ dimensione della matrice

mi viene stupido con questo operatore sizeof in C++, hai qualche idea del perché si tratta di 4 e 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

[Sizeof array passato come parametro] (http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – Blastfurnace

+0

Vedere anche http://stackoverflow.com/questions/1641957/is- array-name-a-pointer-in-c e http://stackoverflow.com/questions/720077/calculating-size-of-an-array - questa è una FAQ. –

risposta

23

Nel main, il nome array è un array in modo da ottenere la dimensione in byte della matrice con sizeof. Tuttavia, un array decade in un puntatore quando viene passato a una funzione, quindi si ottiene sizeof(int*) all'interno della funzione.

essere consapevoli del fatto che l'assunzione di un argomento in forma di T arg[] è esattamente lo stesso che l'argomento come T* arg. Quindi la tua funzione è l'equivalente esatto di

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

Il tuo programma di seguito è simile al prossimo.

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

Il programma sotto stampa la dimensione del puntatore.

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

è equivalente a

void function (int *arg) 

quindi,

sizeof(arg) == sizeof(int*) 

se si intende passare la matrice stessa, allora C++ si offre di passare per riferimento:

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

Ora,

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

Array sono semplicemente puntatori a una quantità arbitraria di memoria. Se esegui sizeof (array) restituirà la dimensione di un puntatore: 4 byte su sistemi a 32 bit e 8 byte su sistemi a 64 bit (se il programma è compilato a 64 bit).

Questa è la stessa ragione per cui è necessario terminare le stringhe in c/C++ - per indicare la fine dell'array.

In poche parole, hai la possibilità di tenere traccia delle dimensioni dei tuoi array. Se si assegna un array di 40 byte, è necessario assicurarsi di non accedere mai all'array sopra il 40 ° indice (cioè array [39]).

Spero che questo aiuti.

+0

Se gli array sono semplicemente dei puntatori, come mai "main" stampa 12? – fredoverflow

+0

Non posso essere sicuro al 100%, ma la mia ipotesi è perché l'array è statico. La sua dimensione è determinata in fase di compilazione, a differenza della memoria dinamica.Sizeof() può funzionare su array statici, ma posso assicurarti che non funzionerà su array allocati dinamicamente durante il runtime. Gli array – Gogeta70

+1

non sono semplicemente indicatori. – xaxxon