charpointer array and sizeof()



  • Hi,

    Ich habe ein Array von Charpointern:

    char* cArray[] = {"Element1", "Element2", "Element3"}
    

    Wie bekomme ich die Anzahl der Array-Elemente heraus?

    sizeof(cArray) liefert 12, sizeof(*cArray) liefert 4. Wie ist das zu interpretieren?

    Gruß,
    Thomas



  • Thomas++ schrieb:

    Ich habe ein Array von Charpointern:

    char* cArray[] = {"Element1", "Element2", "Element3"}
    

    Wie bekomme ich die Anzahl der Array-Elemente heraus?

    Gar nicht. Merk dir die Länge in einer Variablen oder Konstanten, sofern möglich.

    sizeof(cArray) liefert 12

    Ein Array von drei Zeiger. Zeiger (typunabhängig) sind auf 32Bit Maschinen immer 4Byte groß, da die Speicherung einer Adresse eben so viel Platz braucht. Daher 3*4=12.

    sizeof(*cArray) liefert 4. Wie ist das zu interpretieren?

    Ein einzelnes Element des Pointer-Arrays, ein Pointer ist eben 4Byte groß.

    MfG

    GPC



  • Ein Zeiger hat auf deinem System 4 Bytes, drei Zeiger des Arrays haben also 12 Bytes.

    anzahl_elemente = sizeof(cArray)/sizeof(char*)
    


  • GPC schrieb:

    Merk dir die Länge in einer Variablen oder Konstanten, sofern möglich.

    So etwas versucht man normalerweise aus Konsistenzgründen zu vermeiden, oder?

    @1310-Logik
    Jou, die Variante hätte mir eigentlich einfallen müssen. 😉
    Danke!



  • Thomas++ schrieb:

    GPC schrieb:

    Merk dir die Länge in einer Variablen oder Konstanten, sofern möglich.

    So etwas versucht man normalerweise aus Konsistenzgründen zu vermeiden, oder?

    Ne, wieso? Wenn du schon vorher weißt, dass ein Array immer 5 Elemente hat, weil du es z.B. bei Programmstart initialisierst, dann kannst du diese bennante Konstante auch wunderbar in Schleifen usw. verwenden. Erhöht die Lesbarkeit des Quelltextes und ist imho viel besser als das sizeof gefrickle, das auch nicht immer funktionert.

    MfG

    GPC



  • GPC schrieb:

    Wenn du schon vorher weißt, dass ein Array immer 5 Elemente hat, weil du es z.B. bei Programmstart initialisierst, dann kannst du diese bennante Konstante auch wunderbar in Schleifen usw. verwenden. Erhöht die Lesbarkeit des Quelltextes und

    aber wenn man am array was ändert muss man auch die konstante anpassen. das ist doch sehr fehleranfällig...

    GPC schrieb:

    ist imho viel besser als das sizeof gefrickle, das auch nicht immer funktionert.

    wann funktioniert denn sizeof(array)/sizeof(typ_der_arrayelemente) nicht?



  • GPC schrieb:

    Ne, wieso? Wenn du schon vorher weißt, dass ein Array immer 5 Elemente hat, weil du es z.B. bei Programmstart initialisierst, dann kannst du diese bennante Konstante auch wunderbar in Schleifen usw. verwenden. Erhöht die Lesbarkeit des Quelltextes...

    Aber das Eine schließt doch das andere nicht aus:

    int[] abc = {1,42,1}
    const int abcLEN = (int) (sizeof(abc) / sizeof(int));
    

    GPC schrieb:

    besser als das sizeof gefrickle, das auch nicht immer funktionert.

    😮 Was ist das denn für ein Unsinn?

    Wenn etwas bei dir nicht immer funktioniert, besorg
    dir einen vernünftigen Compiler! 😃



  • net schrieb:

    GPC schrieb:

    Wenn du schon vorher weißt, dass ein Array immer 5 Elemente hat, weil du es z.B. bei Programmstart initialisierst, dann kannst du diese bennante Konstante auch wunderbar in Schleifen usw. verwenden. Erhöht die Lesbarkeit des Quelltextes und

    aber wenn man am array was ändert muss man auch die konstante anpassen. das ist doch sehr fehleranfällig...

    Da hast du zwar einerseits Recht, aber wie hoch ist die Wahrscheinlichkeit, dass du vergisst eine Konstante zu ändern, die direkt neben dem Array steht? Ich ging zudem bei meiner Aussage von einem konstanten Array aus, dessen Größe sich nicht ändert. Dann wäre eine benannte Konstante vorteilhaft. Arrays, die sich zur Laufzeit in der Größe ändern, müssen ja eh fast immer eine size-Variable mitführen, so what?

    GPC schrieb:

    ist imho viel besser als das sizeof gefrickle, das auch nicht immer funktionert.

    wann funktioniert denn sizeof(array)/sizeof(typ_der_arrayelemente) nicht?

    Das funktionert. Aber das nicht:

    int *array = malloc(sizeof(*array) * 10);
    
    size_t len = sizeof(array)/sizeof(*array);
    

    Daher meine Aussage "das auch nicht immer funktioniert".

    MfG

    GPC



  • Thomas++ schrieb:

    So etwas versucht man normalerweise aus Konsistenzgründen zu vermeiden, oder?

    Normalerweise schon. Du kannst dir auch ein Makro basteln, dann wird die Verwendung recht einfach, zB

    #define lengthof(x) (sizeof(x) / sizeof(*x))
    

    Du musst dann nur aufpassen, dass du keine Zeiger als Argument verwendest.

    Bei der Variante mit der Konstante würde ich dir nicht Javaner's Code empfehlen. Mach es dann über ein #define, da diese Konstante dann auch ein konstanter Ausdruck ist, und dort verwendet werden kann, wo einer notwendig ist, zB bei non-VLA's:

    char* cArray[] = {"Element1", "Element2", "Element3"};
    #define cArrayLength lengthof(cArray)
    
    char* cArrayCopy[cArrayLength];
    copy_strings(cArrayCopy, cArray, cArrayLength);
    

Log in to reply