Übergabe von c-Arrays als Parameter und Größenermittlung mit sizeof



  • Hallo , hab grade folgendes Problem :

    #include <cstdlib>
    #include <iostream>
    #include "Test.cpp"
    using namespace std;

    //main.cpp :

    int main(int argc, char *argv[])
    {
    char A [] ={'a','b','c'};
    char B [] ={'1','2','3','4','5','6','7','8','9','10','11'};

    cout << sizeof A<<endl; //Ausgabe : 3
    cout << sizeof B<<endl; //Ausgabe : 11
    cout << endl;

    Test meinTest;
    meinTest.test(A); //Ausgabe 4 ??????????????????
    meinTest.test(B); //Ausgabe 4 ??????????????????

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    // Test.cpp :

    class Test {

    public :

    void test(char cF[]){
    cout << sizeof cF<<endl;
    }

    };

    Warum wird nach Übergabe an die Funktion nicht mehr die richtige Größe ermittelt ? (Gibt beide Male 4 aus) 😕
    Danke im Vorraus für schnelle Hilfe 🙂



  • Funktionen nehmen immer nur den Zeiger aufs erste Element statt des ganzen Arrays (dieser Zeiger hat 4 Bytes). Ein Überbleibsel von C.
    Du mußt deswegen die Arraygröße als zweites Argument mitübergeben.



  • oder irgendwann std::vector nehmen



  • Ist der Arrayname nicht schon vor der Übergabe ein Äquivalent zum Zeiger aufs 1.Element und wird auch so behandelt ? Warum funktioniert dann sizeof vor der Übergabe? wird ja auch auf dem Namen und damit für den Zeiger aufs 1.Element aufgerufen....jetzt bin ich verwirrt....oder hab ich da was falsch verstanden?



  • Toman schrieb:

    Ist der Arrayname nicht schon vor der Übergabe ein Äquivalent zum Zeiger aufs 1.Element und wird auch so behandelt ?

    Nein, vorher ists ein Array. Allerdings fressen die ganzen Operationen, die man denkt, mit Arrays zu machen, wie [] in Wirklichkeit nicht ein Array, sondern nur einen Zeiger. Immer, wenn's gebraucht wird, wertet der Arrayname zum Zeiger aufs erste Element aus.

    Warum funktioniert dann sizeof vor der Übergabe?

    Weil sizeof aufs Array geht und der Zeiger da nicht gebraucht wird.



  • In C++ kan man übrigens Arrays als Referenz übergeben. Dabei gehen die Typinformationen nicht verloren. Bei variabler Größe muss man allerdings Templates verwenden. Damit muss die Funktion im Header verfügbar sein. Man kann z.B. sowas machen.

    class Test
    {
    public:
        template <std::size_t N>
        void foo(char (& array)[N])
        {
            private_foo(array, N);
        }
    
    private:
        void private_foo(char* array, std::size_t N);
    }
    

    Auf diese Weise kann man die Funktion in einer Quelldatei (.cpp) implementieren und der Benutzer muss die Größe nicht explizit angeben.

    Gruß
    Don06


Anmelden zum Antworten