dynamisches Feld?



  • Hi,

    wahrscheinlich zum 100sten mal, aber trotzdem:
    Ich möchte ein Feld mit Strings erzeugen, allerdings weiss ich erst zur Laufzeit wieviele Strings das Feld benötigt und wie lang die einzelnen Felder sein müssen.
    Wie geht das?

    Danke.

    Kay



  • schau im faq nach



  • malloc bzw. calloc und realloc sollten dazu eigentlich genügen.



  • int i;

    char ** ptr = (char**) malloc(sizeof(char*) * anzStrings);

    for(i=0; i < anzStrings; i++) {
    (ptr+i) = (char) malloc(sizeof(char)*anzZeichenProString);
    }

    strcpy(ptr, "String1");
    strcpy(
    (ptr+1), "String2");
    usw...



  • ich weiss nicht wie oft ich das heute noch sagen muss aber

    1. sizeof(char) ist immer 1
    2. castet man den Return Wert von malloc nicht, dass kann zu schlecht findbaren Fehlern führen
    3. und i sollte vom Typ size_t sein



  • 1. sizeof(char) ist immer 1

    Ich kann Trolle nicht leiden...

    2. castet man den Return Wert von malloc nicht, dass kann zu schlecht findbaren Fehlern führen

    Und wieso bitteschön?

    3. und i sollte vom Typ size_t sein

    Das sollte auch kein komplett lauffähger Code sein, sondern lediglich als
    Denkanreiz dienen.



  • interpreter schrieb:

    1. sizeof(char) ist immer 1

    Ich kann Trolle nicht leiden...

    Das war ja wohl ein Eigentor!

    interpreter schrieb:

    2. castet man den Return Wert von malloc nicht, dass kann zu schlecht findbaren Fehlern führen

    Und wieso bitteschön?

    Du schreibst ein Programm, so ein richtig großes. Und dann passierts, du mußt ein Feld von int auf long umstellen. Auf deiner Architektur ist ein long größer als ein int. Jeder Cast mit anschließender Pointerarithmetik geht voll in die Hose ...

    interpreter schrieb:

    3. und i sollte vom Typ size_t sein

    Das sollte auch kein komplett lauffähger Code sein, sondern lediglich als
    Denkanreiz dienen.

    Das mag sein, aber

    void main()
    

    ist auch immer falsch. Genauso könntest du sagen, "Ich habe zwar jemanden überfahren, aber ich wollte ja auch nur einen Denkanreiz zum Rückwärtseinparken geben". Und man sollte auch immer prüfen, ob malloc nicht NULL zurückgegeben hat.

    Gruß Tobias



  • sizeof(char) ist immer 1, weil sizeof die größe eines anderen Typen in chars mist 🙂

    aus dem Standard, falls du das immer noch zu trollig hälst

    When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.

    6.5.3.4 The sizeof operator ISO/IEC 9899:1999 (E) (auch als C99 bekannt)

    außerdem kann es zu einem Problem kommen, wenn man malloc castet und einen nicht C99 Compiler benutzt und man vergessen hat stdlib.h zu includieren. Weil bei den C Spezifikationen/Standards vor C99 wurde wenn die Deklaration fehlt immer ein int angenommen

    int main(void) {
      char *ptr=(char*)malloc(2);
    }
    

    dann wurde malloc als wie folgt deklariert angenommen

    int malloc(int);
    

    wenn du nun eine Platform hast, wo sizeof(char*) größer als sizeif(int) ist, dann wird ein Teil des Pointers abgeschnitten und du hast einen Pointer, der wild im Speicher rumzeigt, ob wohl das eigentlich nicht sein kann.

    Deswegen castet man malloc nicht!

    Das sollte auch kein komplett lauffähger Code sein, sondern lediglich als
    Denkanreiz dienen.

    mein Kommentar auch. Ich will euch ja nur vor Fehlern bewahren.


Anmelden zum Antworten