Länge eines arrays bestimmen



  • hiho,

    man kann das ja mit:

    int bla[] = {1, 2, 3}
    return sizeof(bla)/sizeof(int)
    

    machen, aber was, wenn ich das array einer Funktion übergebe, also einen Zeiger auf int hab?

    void function(int* arr)
    {
    int a = sizeof(arr);
    int b = sizeof(*arr);
    }
    

    a und b sind bei mir jedesmal 4, was ja die Größe eines int ist. Wie macht man das in dem Fall?



  • etweder die größe mit übergeben bei der Funktion
    oder das Ende mit einem Terminierungswert (z.B.: -1) anzeigen
    wird übrigends bei strings gemacht "HALLO" = 'H', 'A', 'L', 'L', 'O', 0



  • banshee schrieb:

    hiho,

    man kann das ja mit:

    int bla[] = {1, 2, 3}
    return sizeof(bla)/sizeof(int)
    

    machen, aber was, wenn ich das array einer Funktion übergebe, also einen Zeiger auf int hab?

    void function(int* arr)
    {
    int a = sizeof(arr);
    int b = sizeof(*arr);
    }
    

    a und b sind bei mir jedesmal 4, was ja die Größe eines int ist. Wie macht man das in dem Fall?

    sizeof liefert die Anzahl von Bytes, die eine Variable braucht, um ihren Inhalt zu speichern. Bei

    int bla[] = {1, 2, 3};
    

    wird ein Array angelegt, welches 3 Integers speichert, ergo liefert sizeof(bla) nämlich 3*sizeof(int) = 12 (bei x86 Rechnern)

    Ein Zeiger ist eine Variable die nur eine Adresse speichert. Sie hat unabhängig vom Typ immer die selbe Größe, bei x86 Rechnern 4 Bytes. D.h. sizeof(int*) == sizeof(char*) == sizeof(void*) == sizeof(long**) == usw.

    Bei

    void function(int* arr)
    {
    }
    

    Dieser Zeiger zeigt entweder auf eine einzelne Int Variable oder auf den Anfang eines Arrays. Das ändert aber nichts an der Tatsache, dass 'arr' ein Zeiger ist, und somit sizeof(arr) == 4 ist.

    Wenn du ein Array an eine Funktion übergibst, musst du die Array Länge mitübergeben.



  • supertux schrieb:

    Ein Zeiger ist eine Variable die nur eine Adresse speichert. Sie hat unabhängig vom Typ immer die selbe Größe,

    *flüster* far, near, etc. 😉



  • Tim schrieb:

    supertux schrieb:

    Ein Zeiger ist eine Variable die nur eine Adresse speichert. Sie hat unabhängig vom Typ immer die selbe Größe,

    *flüster* far, near, etc. 😉

    verstehe nicht ganz, was du damit sagen willst. Mir ist jedenfalls keinen Fall bekannt, wo zwei Zeiger unterschiedliche Größen wären (lass mich natürlich eines besseren belehren)



  • supertux schrieb:

    Mir ist jedenfalls keinen Fall bekannt, wo zwei Zeiger unterschiedliche Größen wären (lass mich natürlich eines besseren belehren)

    sämtliche derivate von 16 bit prozessoren, deren adressbereich von usrprünglich 64K auf meherere MB aufgeweitet wurde, haben 'near' und 'far' pointer. prozessoren wie z.b. ein freescale HCS12, die einen nichtlinearen adressbereich haben, haben verschiedene pointerlängen.
    ...und bei der schlechtesten programmiersprache der welt sind pointer dabei, die bis zu 10 bytes gross sind (aber das hat ja nichts mit C zu tun).
    🙂



  • pointer-freak schrieb:

    ...und bei der schlechtesten programmiersprache der welt sind pointer dabei, die bis zu 10 bytes gross sind

    Hey alda hast du was gegen AWL? Schau doch mal, wie groß so ein C++ Methodenzeiger werden kann (mit evtl. virtueller Mehrfachvererbug mmhhhh) und mecker net rum ;).

    @OP: die Größe des statischen Arrays geht bei der Parameterübergabe verloren. In C++ könntest du eine Template-Funktion schreiben, bei welcher es dann nicht der Fall wäre.


Anmelden zum Antworten