Funktionsvariablen dynamisch?



  • 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.


Anmelden zum Antworten