Frage zur Berechnung der Anzahl der Elemente vom int array



  • Guten Tag, Alle

    Ich möchte die Integer-Zahlen aus einem int Array zählen, habe immer falsches Ergebnis.

    Software: Eclipse cpp Luna und System: windows8.1 64bit

    Mein Code:

    int intArrayx[] = {3, 5, 7, 9, 12}; 
    
    int anzElm = sizeof(intArr)/sizeof(intArr[0]);
    
    printf("Die Groesse vom Int-Array ist: %d", anzElm);
    

    als Ergebnis gibt es immer 2 aus...

    Weiß jemand warum es so ist?

    Vielen Dank und schönen Tag!

    Carvin



  • Vergleiche mal deine Array-Variablennamen 😉



  • Hi, th69

    Danke für die Antwort, ich habe eigentlich eine Funktion in header Datei geschrieben um die Anzahl der Elemente auszugeben, wie folgendes:

    anzahl.cpp

    #include "header/anzahl.h"
    
    void ausgebeIntArray(int intArr[]){
    
    	//??? Dont work ???
    	int anzElm = sizeof(intArr)/sizeof(intArr[0]);
    
    	//int *intPoint = intArr;
    
    	/*
    	while(*intPoint !='\0'){
    
    		anzElm++;
    	}
    	*/
    
    	//string arrayCopy = intArr;
    	//int anzStrElm = arrayCopy.length();
    
    	if(anzElm != 0){
    
    		printf("Die Groesse vom Int-Array ist: %d", anzElm);
    
    	}else{
    
    		printf("Leerer Array \n");
    	}
    }
    

    Dann im Main-Programm die Funktion mit einem int-Array als Parameter aufrufen wie folgendes:

    uebung01.cpp

    #include "header/anzahl.h"
    int intArrayx[] = {3, 5, 7, 9, 12};
    
    ausgebeIntArray(intArrayx);
    

    Warum bekomme ich 2?

    Danke sehr 😉



  • hanowde schrieb:

    Hi, th69

    Danke für die Antwort, ich habe eigentlich eine Funktion in header Datei geschrieben um die Anzahl der Elemente auszugeben, wie folgendes:

    anzahl.cpp

    #include "header/anzahl.h"
    
    void ausgebeIntArray(int intArr[]){
    
    	//??? Dont work ???
    	int anzElm = sizeof(intArr)/sizeof(intArr[0]);
    

    [/code]

    Warum bekomme ich 2?

    weil sizeof ein Operator ist und wird zur Compilezeit ausgewertet.

    int arr[] = { 1,2,3,4,5};
    
    int size = sizeof arr / sizeof *arr;
    

    funktioniert hier, weil der Compiler weiß, wie viele Bytes arr verwendet und wie viele Bytes *arr verwendet.

    Hier aber

    void foo(int arr[])
    {
        int size = sizeof arr / sizeof *arr;
    }
    

    wird arr nicht als Array übergeben sondern als ein Pointer zur ersten Stelle des Arrays, also ist quasi äquivalent zu

    void foo(int *arr)
    {
        int size = sizeof arr / sizeof *arr;
    }
    

    und sizeof *arr ist konstant.



  • Du machst den klassischen Anfängerfehler in C und ignorierst, dass ein Array als Argument einer Funktion immer in einen Zeiger (auf das erste Arrayelement) zerfällt, d.h. innerhalb der Funktion liefert das sizeof statt
    sizeof(Array) => Größe des Arrays in Bytes
    immer
    sizeof(Zeiger) => Größe des Zeigers in Bytes

    Deshalb übergibt man die Arraygröße bei Funktionen überlicherweise immer als Extra-Parameter

    void ausgebeIntArray(int intArr[],size_t groesse);
    bzw.
    ...
    ausgebeIntArray(intArr,sizeof(intArr));
    


  • Hallo hanowde,

    das ist ja auch ein anderer Code als dein erster.
    Im 2. Fall wird kein Array an die Funktion übergeben, sondern nur ein Zeiger auf das erste Element ("int Arr[]" entspricht "int *intArr"), und dadurch wird die Größe eines Zeigers benutzt. Weiteres findest du unter dem Suchbegriff "array to pointer decay".

    Übergib die Array-Größe daher als weiteren Parameter an die Funktion:

    int intArrayx[] = {3, 5, 7, 9, 12};
    int anzElm = sizeof(intArr)/sizeof(intArr[0]);
    
    ausgebeIntArray(intArrayx, anzElm);
    


  • Vielen Dank für eure schnelle Antwort!!!

    Das Problem habe ich behoben.

    LG, Carvin 😉


Log in to reply