Die Größe von Arrays erst bei Initialisierung festlegen?



  • Hallo Forum,

    ich beginne gerade erst damit mich in die Sprache C einzuarbeiten.
    Ich bin nun durch Zufall darauf gestoßen, dass die Größe von Arrays bereits dem Compiler bekannt sein muss.

    Folgender Code lässt sich aber übersetzen und scheint auch problemlos zu funktionieren:

    #include <stdio.h>
    
    int main(void) {
    
        int count;
        int i;
        printf("Array-Test\n");
        printf("Bitte gib die Größe des Arrays an: ");
        scanf("%d", &i);
        printf("\n");
        int array[i];
        for (count = 0; count < sizeof(array)/sizeof(array[0]); count++) {
            array[count] = count - 400;
            printf("Setze Array-Element: %d\n", count);
        }
        for (count = 0; count < sizeof(array)/sizeof(array[0]); count++) {
            printf("Element an Stelle %d hat den Wert %d\n", count, array[count]);
        }
    
    }
    

    Die Ausgabe lautet:

    Array-Test
    Bitte gib die Größe des Arrays an: 10

    Setze Array-Element: 0
    Setze Array-Element: 1
    Setze Array-Element: 2
    Setze Array-Element: 3
    Setze Array-Element: 4
    Setze Array-Element: 5
    Setze Array-Element: 6
    Setze Array-Element: 7
    Setze Array-Element: 8
    Setze Array-Element: 9
    Element an Stelle 0 hat den Wert -400
    Element an Stelle 1 hat den Wert -399
    Element an Stelle 2 hat den Wert -398
    Element an Stelle 3 hat den Wert -397
    Element an Stelle 4 hat den Wert -396
    Element an Stelle 5 hat den Wert -395
    Element an Stelle 6 hat den Wert -394
    Element an Stelle 7 hat den Wert -393
    Element an Stelle 8 hat den Wert -392
    Element an Stelle 9 hat den Wert -391

    Verwenden tue ich den gcc 4.1.3.
    Liegt es an diesem (neuen?) Compiler, dass sich an dieser Stelle die Größe des Arrays dynamisch setzen lässt?

    Vielen Dank für eure Hilfe.

    Gruß
    Sparrow



  • Ja. Neues C kann sowas. Die Vorgängerversion (C98 ???) erlaubte sowas noch nicht.



  • Ah, super!

    Vielen Dank!



  • C89 ist der "Vorgänger".



  • feigling schrieb:

    C89 ist der "Vorgänger".

    Ah, Danke!
    Ich war mir nicht sicher ob es K&R-C oder C89 hieß. Diese alte Version, bei der die Typen über der Argumentenliste im Funktionskopf standen, verwendet heute wohl keiner mehr.



  • welche datei-endung hat dein main programm ?



  • Die Datei heißt einfach test.c .
    Übersetzt habe ich sie mit gcc -o test test.c.



  • ja, ok. häufig stellt man fest, das manche ihre dateien mit der endung *.cpp übersetzen, ohne zu wissen C++ features aktiviert zu haben. :p



  • Danke für den Hinweis.
    Im Augenblick steht nur C bei mir auf dem Speiseplan um irgendwann mal an die hardwarenahe Programmierung zu kommen.

    Gruß
    Sparrow



  • mit diesen vl-arrays musste aber vorsichtig sein, wegen stack-overflows. also nur benutzen, wenn du ganz sicher bist, dass eine bestimmte maximalgrösse nicht überschritten wird. das ist nicht so wie bei malloc, das eine 0 zurückgibt, wenn der speicher aufgebraucht wird.
    🙂


Anmelden zum Antworten