malloc oder char a[]



  • Auch ist manchmal ganz fein, nicht bis zum Ende des Blockes warten zu müssen, sondern den Speicher irgendwo freizugeben.



  • Seit wann bekommst Du denn mit a[] eine 'veränderbare Größe für den Speicher'?



  • seit C99



  • Nur als member von structs. Und selbst dort wäre 'veränderbare Größe für den Speicher' imho falsch ausgedrückt.



  • Kannst Du mir bitte mal ein Beispiel posten?



  • leute er meint array variabler größe. man muss nicht immer auf jedem haar in der suppe rumreiten, wenn man genau weiss was der OP meint 🙄



  • Tim schrieb:

    Nur als member von structs. Und selbst dort wäre 'veränderbare Größe für den Speicher' imho falsch ausgedrückt.

    Wie?
    Mit VLAs kann man doch folgendes machen, oder?

    void func(size_t n)
    {
        char a[n];
        /*...*/
    }
    


  • Ja, das ist ein VLA und da geht das natürlich. Aber dieses a[] ist halt kein VLA. Vielleicht meint der OP aber auch einfach sowas:

    int a[] = {1, 2, 3, 4, 5};
    

    Seine Fragestellung ist halt nicht sonderlich glücklich gewesen, auch wenn fix0r das offensichtlich nicht so sieht.



  • Also erst mal Danke für die Antworten.
    Bin ja erstaunt, dass ne Frage von nem Anfänger wie mir so ne Diskussion auslöst 🙂

    Aber mal n paar Anschlussfragen zu euren Antworten:
    Hab mal C99 gegoogelt: ist C99 nicht der normale Standart? (seit 99 halt)

    reservere ich (streng genomen) mit char a[5] keinen Speicher in der Größe con 5 Byte? sprich: Was ist der Unterschied zwischen array variabler Größe und veränderbarer Speicher?

    @ Tim bei mir geht das ohne member von struct zu sein...

    und was bedeutet bitte, dass ich auf das Ende des Blocks warten muss?

    Also wie ihr seht...jede Antwort wirft bei mir ne neue Frage auf 😉
    Vielleicht kann mir das ja jemand beantworten.
    Da das sehr viele Fragen sind wäre ich auch über ne Literaturempfehlung dankbar die weiterführt als mein Buch "Jetzt lerne ich C" und das Wikiboo C mit dem ich bis jetzt arbeite...

    Danke schonmal



  • mythtranor schrieb:

    reservere ich (streng genomen) mit char a[5] keinen Speicher in der Größe con 5 Byte?

    doch, aber der Speicher befindet sich auf dem Stack und ist nur für die Funktion gültig, die das Array deklariert hat. malloc(5) reserviert auch 5 Bytes, aber auf dem Heap und ist solange gültig, bis man den Speicher explizit freigibt.

    mythtranor schrieb:

    Was ist der Unterschied zwischen array variabler Größe und veränderbarer Speicher?

    Derselbe wie bei Äpfeln und Birnen 😉 du meinst zwischen arrays fester und variable Größe, oder?

    bist C98 konnte man nur Arrays fester Größe erstellen, sprich, zur Compilezeit musste schon feststehen, wie viele Elemente das Arrays haben wird

    char arr[1024];
    char arr[1024] = "Hallo";
    char arr[] = "Hallo";
    char arr[];
    
    int n = 9;
    char [n];
    

    die erste Anweisung deklariert ein 1-dim char Array mit 1024 Felder

    die zweite Anweisung macht dasselbe, die ersten 6 Bytes werden zusätzlich mit 'H', 'a', 'l', 'l', 'o', '\0' initialisiert

    die dritte macht dasselbe wie die zweite, mit dem Unterschied, dass nur 6 Bytes reserviert werden. Der Compiler weiß, dass "Hallo" 6 Bytes braucht, also reserviert er auch 6 Bytes auf dem Stack für dieses Array. Es sieht nur so aus, als würde das ein Array variabler Größe sein, ist es aber nicht. Der Compiler weiß schon, wie groß das Array sein wird. Zur Laufzeit ändert sich dort aber gar nichts.

    die vierte Anweisung ist ein Syntaxfehler.

    die fünfte Anweisung ist ein VLA, ein Array variable Länger, das geht aber nur ab C99.

    Alle sind Arrays, die Größe des Arrays kann man während der Laufzeit nicht verändern. Du kannst nur bei dynamisch angeforderten Speicher die Größe verändern.


Anmelden zum Antworten