Arraygröße nach übergabe an Funktion



  • sizeof() wird dir immer nur die größe des Zeigers, des Datentyps etc liefern. Nicht die größe der Inhalte.
    Wenn du ein Array mit zehn Elementen hast gibt dir sizeof(Array) vier aus. Hast du zwanzig ist es immernoch vier. Dabei spielt der Typ des Arrays keine Rolle. Es wird immer die größe eines Integers sein, da der die Adresse bei Pointern in integer Form gespeichert wird.
    Bei char Arrays kannst du, wenn du eine '\0' am Ende hast mit strlen() die Länge bestimmen. Bei anderen Variablentypen musst du schauen wie du sicherstellst das du im Rahmen bleibst.



  • Skalli schrieb:

    Es wird immer die größe eines Integers sein, da der die Adresse bei Pointern in integer Form gespeichert wird.

    das ist zufälligerweise auf PCs so...
    🙂



  • Skalli schrieb:

    sizeof() wird dir immer nur die größe des Zeigers, des Datentyps etc liefern. Nicht die größe der Inhalte.
    Wenn du ein Array mit zehn Elementen hast gibt dir sizeof(Array) vier aus. Hast du zwanzig ist es immernoch vier. Dabei spielt der Typ des Arrays keine Rolle. Es wird immer die größe eines Integers sein, da der die Adresse bei Pointern in integer Form gespeichert wird.
    Bei char Arrays kannst du, wenn du eine '\0' am Ende hast mit strlen() die Länge bestimmen. Bei anderen Variablentypen musst du schauen wie du sicherstellst das du im Rahmen bleibst.

    das ist nicht ganz richtig. wenn ich nämlich in der main-methode sizeof(c) ausgeben lasse, dann ändert sich der wert in abhängigkeit der elementzahl.
    daher auch meine frage, warum das so ist, obwohl die ausgabe von "c" alleine tatsächlich nur die anfangsadresse des arrays zum ergebnis hat.
    Beispiel:

    int main() {
        char c[]={1,2,3};
        printf("Adresse von c ist: %d\nGroesse von c ist: %d\n\n", c, sizeof(c));
        char i[]={1,2,3,4,5,6};
        printf("Adresse von i ist: %d\nGroesse von i ist: %d", i, sizeof(i));
        return 0;
    }
    

    Die Ausgabe dazu ist:

    Adresse von c ist: 2293616
    Groesse von c ist: 3

    Adresse von i ist: 2293584
    Groesse von i ist: 6

    vielleicht ist meine frage, so formuliert, etwas verständlicher.
    wie ihr seht scheint der arrayname "c" innerhalb der main-methode ein zeiger auf die adresse des ersten array-elementes zu sein, trotzdem gibt sizeof(c) nicht die größe der adresse, sondern die größe des arrays an.

    warum ist das so in der main-funktion, während das in "normalen" funktionen, die ein array als parameter enthalten, nicht funktioniert?

    lg,

    dominik



  • Bartfratze schrieb:

    warum ist das so in der main-funktion, während das in "normalen" funktionen, die ein array als parameter enthalten, nicht funktioniert?

    weil die funktionen nur einen pointer auf das array bekommen, nicht das array selbst. von arrays ist immer dann die grösse bekannt, wenn direkt darauf zugegriffen werden kann.
    🙂



  • Ahh ok, das heißt wenn ich "c" ausgeben lasse (in der main-methode), dann interpretiert der compiler das so, als ob ich eigentlich "&c" geschrieben hätte, und wenn ich den sizeof()-operator benutze, dann interpretiert der compiler das "c" als bezug auf das gesamte array?

    lg,

    dominik



  • Bartfratze schrieb:

    Ahh ok, das heißt wenn ich "c" ausgeben lasse (in der main-methode), dann interpretiert der compiler das so, als ob ich eigentlich "&c" geschrieben hätte...

    ne, im gegenteil, dann betrachtet er das array selbst. ne adresse brauchts dafür nicht. beispiel:

    char a[100];
    
    void f (char *b)
    {
      printf ("%d\n", sizeof(a));   // array    (100)
      printf ("%d\n", sizeof(b));   // pointer  (pointergroesse)
    }
    
    void main()
    {
      char b[200];
      printf ("%d\n", sizeof(a));  // array   (100)
      printf ("%d\n", sizeof(b));  // array   (200)
      f(b);
    }
    

    🙂



  • also das hab ich verstanden, aber ich meine eher folgenden fall:

    int main(void) {
        char c[10];
        printf("%d", c);
        return 0;
    }
    

    hier gibt er mir ja als ausgabe die adresse vom c-array.
    an der stelle scheint der compiler das "c" ja doch als adresse, und nicht als array selbst zu interpretieren. oder wie ist das verhalten sonst zu erklären?

    danke schonmal im voraus,

    dominik



  • Bartfratze schrieb:

    an der stelle scheint der compiler das "c" ja doch als adresse, und nicht als array selbst zu interpretieren. oder wie ist das verhalten sonst zu erklären?

    das stimmt. an 'printf' wird die adresse des arrays übergeben. printf ist ja nicht so'n eingebautes ding wie 'sizeof', d.h. zur laufzeit weiss printf nichts über die grösse des arrays. nimm übrigens für sowas besser %p, nicht %d
    🙂



  • Ach verdammt, hab die ganze zeit verpeilt, dass ich, wenn ich nur "c" an printf() übergebe, natürlich auch nur die adresse übergeben kann (denn schließlich ist printf() ja eine funktion, und an die werden ja bekanntlich nur array-adressen übergeben ^^).
    andersrum hab ich verpeilt, dass sizeof() ja nur ein operator ist, und keine funktion... 😛

    gott so ein brett vorm kopf hatte ich lange nicht mehr 😃
    vielen dank für eure hilfe 🙂

    lg,

    dominik



  • schreib in Zukunft einfach immer sizeof object die Klammern brauchst du bei sizeof nur wenn der Ausdruck dahinter ein Typ und kein Objekt ist.


Anmelden zum Antworten