Funktionsvariablen dynamisch?



  • Ich hab gelesen dass C keine dynamische Speicherverwaltung erlaubt,
    außer man benutzt diese speziellen Befehle (malloc, memcpy und sowas)

    damit ist ja beispielsweise gemeint, dass so etwas nicht geht:

    void test(int a)
    {
      int array[a];
    }
    

    so etwas geht natürlich auch nicht

    Aber wie sieht das nun bei Funktionsvariablen aus?

    void test(int a)
    {
      int a = 0;
    }
    

    beleibt das a erhalten, oder wird der Speicher des a nach der Funktion wieder freigegeben?
    ich dachte der Speicher wird dann freigegeben, aber das wäre ja auch irgendwie dynamisch



  • Nach beendigung einer Funktion werden die lokalen Variablen gelöscht und der speicher wieder freigegeben. (wenn du das meinst)

    C/C++ Code:
    void test(int a)
    {
    int array[a];
    }

    Ich zietire mal meinen Programmierlehrer:

    Ein arry darf nur mit Konstanten angegeben werden

    wobei ich mir gar nicht sicher bin ob das jetzt als Konstante zählt oder nicht ich denke es zählt nicht.

    Zu deinem 2. Beispiel:

    Es würde aus dem grund nicht Funktionieren weil du die Variable a doppelt deklarierst.
    Das allerdings würde gehen:

    void Test(int a){
      a=23;
      ...
    

    Ich hoffe ich konnte dir weiterhelfen und hab dir keinen unsinn beigebracht.



  • Hallo,

    scales of justice schrieb:

    damit ist ja beispielsweise gemeint, dass so etwas nicht geht:

    void test(int a)
    {
      int array[a];
    }
    

    Doch, das geht seit C99 und nennt sich Variable Length Arrays. In C++ gibt's das übrigens nicht.

    void test(int a)
    {
      int a = 0;
    }
    

    Wie gesagt, blödes Beispiel, machen wir's doch so:

    int foo() {
      int bar=0;
      return bar;
    }
    

    Sobald foo abgearbeitet ist, wird bar wieder gekillt. Deshalb soll man auch keine Pointer (C++: Referenzen) auf lokale Objekte/Variablen zurückgeben (außer sie sind statisch bzw. dynamisch allokiert worden)!

    MfG

    GPC



  • gut danke, dachte schon ich müsst jetzt den ganzen Speicher selber freigeben
    C99 gabs bei Turbo C noch nicht oder?

    void test(int a)
    {
      int array[a];
    }
    

    will er bei mir definitif nicht machen



  • void test(int a)
    {
      int array[a];
    }
    

    Das geht!!!!
    Kann ich kaum glauben wie sit das Beispiel zu verstehen?

    void test(int a)
    {
      int array[a];
    } 
    int main() {
    int a;
    scanf("%i", &a);
    test(a);
    return 0;
    }
    

    oder so

    void test(int a)
    {
      int array[a];
    } 
    int main() {
    int a = 3;
    test(a);
    return 0;
    }
    

    Das 1. kann ich mir garnicht vorstellen, dann bräuchte man ja kein malloc mehr.
    Das 2. Allerdings schon, da ist ja a so gut wie 3 allerdings nur wenn die variable nciht verändert wird. also dann sowas const int a = 3;



  • Verdammt das geht ja beides!
    Kennt ihr das wenn ihr meint etwas sicher zu wissen und dann plötzlich ist es falsch!
    Man! Und in C++ geht das nicht? Das Programmierich hauptsächlich, vll. kenn ichs darum nicht.

    //EDIT
    Ich glaub ich dreh durch!

    #include <stdio.h>
    
    void test(int a)
    {
       int array[a];
       array[5] = 1;
       printf("%i", array[5]);
    }
    int main() {
       int a = 3;
       test(a);
       printf("\n hello\n");
       return 0;
    }
    

    Funktioniert einwandfrei! Das müsste nen Speicherfehler geben
    Und in c++ gehts auch! Ich schalt meinen PC lieber aus, ich glaub ich träume



  • Storm.Xapek.de schrieb:

    Das 1. kann ich mir garnicht vorstellen, dann bräuchte man ja kein malloc mehr.

    Doch. Man braucht malloc() trotzdem noch. VLAs sind für viele Sachen (wohl die Meisten) nicht geeignet.



  • Storm.Xapek.de schrieb:

    Funktioniert einwandfrei! Das müsste nen Speicherfehler geben
    Und in c++ gehts auch! Ich schalt meinen PC lieber aus, ich glaub ich träume

    Einen Speicherfehler wie du es meinst tritt nur dann auf wenn du auf Wertebereiche zugreifst die ausserhalb des fuer dein Programmm reservierten Speicher liegen. Dann sollte das Programm aufgrund einer Speicherverletzung vom Kernel abgebrochen werden.

    Hier allerdings greifst du nur auf den Index 5 zu, der bei dir halt noch innerhalb des Speicherbereichs liegt. Solche Indexueberschreitungen werden von C nicht geprueft, es ist aber gefaehrlich weil du so fuer dein Programm wichtige (andere) Werte veraendern koenntest!



  • Storm.Xapek.de schrieb:

    Und in C++ geht das nicht?

    Offiziell nicht, kann aber sein, daß ein bestimmter Compiler das trotzdem unterstüzt. In C++ hast du stattdessen Containerklassen, die sind sogar noch flexibler als VLA's.



  • CStoll schrieb:

    Storm.Xapek.de schrieb:

    Und in C++ geht das nicht?

    Offiziell nicht, kann aber sein, daß ein bestimmter Compiler das trotzdem unterstüzt. In C++ hast du stattdessen Containerklassen, die sind sogar noch flexibler als VLA's.

    Der GCC unterstützt es auch für C++.
    Die Argumentation war irgendsowas wie, um die Abwärtskompatibilität von C++ zu gewährleisten
    (das also problemlos von C nach C++ portiert werden kann) wird das in C++ als
    zusätzliches Feature mit eingebaut.

    Der GCC ist aber afaik sowieso der einzige Compiler der VLAs unterstützt - egal ob
    C oder C++ ⚠

    lg icepacker



  • icepacker schrieb:

    Der GCC ist aber afaik sowieso der einzige Compiler der VLAs unterstützt - egal ob
    C oder C++ ⚠

    Der XL C/C++ V7.0 frisst es auch. Ich vermute aber, dass es der Borland und MSVC++ ebenfalls unterstützt.

    MfG

    GPC



  • Ich habe gerade in der msdn nichts dazu gefunden, kann aber natürlich trotzdem sein...

    Also wär cool wenn das mal jemand testen könnte(MSVC++, Borland, etc.)!



  • Storm.Xapek.de schrieb:

    void test(int a)
    {
      int array[a];
    }
    

    Das geht!!!!
    ....
    Das 1. kann ich mir garnicht vorstellen, dann bräuchte man ja kein malloc mehr.

    das array wird aber auf'm stack angelegt. das ist genauso mies wie 'alloca()' wenn a zu gross ist, haste 'nen stack overflow. mach lieber arrays gross genug wie du's brauchst, nicht variabel, dann stürzt dein programm gleich ab und nicht zufällig irgendwann mal.



  • So dann bin, ich wieder, ich hab mal ne nacht darüber geschlafen.
    Kommt mir heute auch garnichtmehr so komisch vor.
    Aber ich bleib lieber bei meinen guten alten statischen arrays.
    Danke für die ausführliche Erklärung dieser VLA's.


Log in to reply