2017-01-11 6 views
0

Ich habe meine sizeof(array)/sizeof(*array) ausgedruckt und bekomme die Nummer drei, aber wenn ich mein Array in meine Funktion gebe, gibt es 2 aus, wenn es in einer Variablen gespeichert ist, und iteriert daher eine Zeit weniger als es sollte.Warum iteriere ich weniger oft als erwartet?

void printAry(int ary[]) 
{ 
    int size = sizeof(ary)/sizeof(ary[0]); 
     cout<<size;//size will print out 2! why? 
     for(int i = 0; i < size;i++) 
    { 
     cout<<ary[i]; 
    } 
} 

int main() { 
    int ary[3] = {1,2,3}; 
    cout<<sizeof(ary[0]); 

    return 0; 
} 

Warum wiederholt es ein Mal weniger als erwartet?

+2

Das Array wird als ein Pointer innerhalb der Funktion interpretiert, daher das Problem. Schlimmer noch, du übergibst ein einzelnes Mitglied von 'ary' an die Funktion, nicht das ganze Array. – ForceBru

+0

'ary' ist Zeiger in' printAry', nicht 'Array von int'. – BLUEPIXY

Antwort

4

Der Grund ist, dass Arrays in Zeiger zerfallen.

Grundsätzlich

void printAry(int ary[]) 

entspricht:

void printAry(int* ary) 

So sizeof(ary) auf die Größe des Zeigers auf int auf Ihrem System gleich ist.

+0

Wenn es Ihnen nichts ausmacht: Ich habe "Zeiger auf' int' "hinzugefügt, da nicht alle Zeiger * notwendigerweise * die gleiche Größe haben müssen. – Bathsheba

+0

@Bathsheba ja, zum Beispiel Zeiger auf Funktionen hypothetisch können eine andere Größe haben. Guter Punkt! –

+0

Dies gilt auch für Grundelemente, z. 'sizeof (int *)' könnte sich von 'sizeof (long *)' unterscheiden. – Bathsheba

4

können Sie nicht die sizeof(ary)/sizeof(ary[0]) Idiom verwenden, wenn ary ein Funktionsparameter ist, da es bereits in einen Zeigertyp abgeklungen haben: sizeof(ary) lediglich die Größe eines Zeigers auf int auf Ihrer Plattform.

In C, müssen Sie die Größeninformationen explizit passieren, oder eine Konvention übernehmen, die einen bestimmten Wert das Ende der Array-Signale (vgl '\0' im C-Standard-Bibliothek String-Funktionen.)

In C++, Sie können eine std::vector verwenden.

Verwandte Themen