ANSI-C und ANSI-C++



  • THX 1138 schrieb:

    C : --> array
    C++ : --> vector

    Das kann man so auch wieder nicht sagen. Zum einen ist das Array "besser" in die Sprache integriert:

    void foo(int n) {
            char array[n];
            printf("%d\n", sizeof(array));
    }
    

    So gibt foo(3) eben 3 und foo(10) eben 10 aus. Wichtiger ist aber vielleicht noch der Unterschied, dass ein solches Array in C zwar eine variable Länge hat, anders als der C++ vector aber trotzdem statisch ist. Denn ist die Anzahl der Felder n des Arrays einmal festgelegt, dann steht sie für den gesamten Block fest und kann nicht mehr verändert werden. Es kann nicht wie beim vector etwas hinzugefügt oder weggenommen werden.



  • TactX schrieb:

    VLAs haben mit Speicherverwaltung a la malloc/new/Container eigentlich recht wenig zu tun. Sie sind mehr ein portabler Ersatz von man: alloca().

    vla und 'alloca' sind aber beide mit vorsicht zu geniessen. buffer overflows sind damit vorprogrammiert.
    ich hab vla noch nie verwendet. viele compiler kennen das auch gar nicht.



  • ten schrieb:

    vla und 'alloca' sind aber beide mit vorsicht zu geniessen. buffer overflows sind damit vorprogrammiert.

    Gibt es in dem Punkt bei variablen Arrays deiner Meinung nach einen Unterschied zu "normalen" Arrays?
    Der GCC unterstützt übrigens die meisten C99-Features inklusive VLAs.



  • minhen schrieb:

    Der GCC unterstützt übrigens die meisten C99-Features inklusive VLAs.

    Ihr tut hier so als wäre das was ausergewöhnliches?
    Natürlich unterstütz der GCC das, ist ja auch ein C Compiler.
    Und wie die meisten Compiler hat auch der GCC Sprach-Erweiterungen.



  • lolz schrieb:

    minhen schrieb:

    Der GCC unterstützt übrigens die meisten C99-Features inklusive VLAs.

    Ihr tut hier so als wäre das was ausergewöhnliches?

    Weil es nicht selbstverständlich ist. Was ist mit den MS-und Borland-Compilern? Unterstützen die C99? Und dann noch die ganzen Compiler für Controller? Da sieht es eher mau aus. Das einzige was C-Compiler heutzutage durchgängig aus C99 können ist //.



  • ten schrieb:

    TactX schrieb:

    VLAs haben mit Speicherverwaltung a la malloc/new/Container eigentlich recht wenig zu tun. Sie sind mehr ein portabler Ersatz von man: alloca().

    vla und 'alloca' sind aber beide mit vorsicht zu geniessen. buffer overflows sind damit vorprogrammiert.
    ich hab vla noch nie verwendet. viele compiler kennen das auch gar nicht.

    VLA ist wirklich ein fragwürdiges Sprachfeature. Es ist ja im Grunde kaum möglich auf mögliche Stack-Überlaufe zu prüfen und der GCC zB hat auch keine eingebauten Checks. (Viele Compiler kennen zwar keine VLAs, aber die kennen auch so gut wie keine andere C99-Erweiterung (zB _Complex, _Bool, stdint.h, long long etc.)

    In C++09 sollen sie ja auch nicht aufgenommen werden.



  • lolz schrieb:

    minhen schrieb:

    Der GCC unterstützt übrigens die meisten C99-Features inklusive VLAs.

    Ihr tut hier so als wäre das was ausergewöhnliches?
    Natürlich unterstütz der GCC das, ist ja auch ein C Compiler.
    Und wie die meisten Compiler hat auch der GCC Sprach-Erweiterungen.

    In C++ ist es was aussergewöhnliches. Was interessiert mich als C++-Programmierer ein C-Compiler? 🙄

    Nochmal, auch wenn langweilig wird:

    C++ != C



  • gcc != g++ ?



  • THX 1138 schrieb:

    gcc != g++ ?

    nicht wirklich. g++ ist der gcc, nur das er die std-lib linkt. Aber wenn du das meinst, der GCC hat intern zwei verschiedene Parser für C und C++ 🙂



  • minhen schrieb:

    ten schrieb:

    vla und 'alloca' sind aber beide mit vorsicht zu geniessen. buffer overflows sind damit vorprogrammiert.

    Gibt es in dem Punkt bei variablen Arrays deiner Meinung nach einen Unterschied zu "normalen" Arrays?

    naja, bei normalen arrays ist der speicher wenigstens immer da. bei vla weiss man das nie so genau...



  • ten schrieb:

    naja, bei normalen arrays ist der speicher wenigstens immer da.

    Echt?

    void rec(void){
    	unsigned int smallone[256];
    	smallone[0] = 0xDAU;
    	rec();
    	return;
    }
    
    int main (void) {
        unsigned int bigone[1024*1024];
        rec();
        bigone[1024*1024-1] = 0xDAU;
        return 0;
    }
    


  • TactX schrieb:

    ten schrieb:

    naja, bei normalen arrays ist der speicher wenigstens immer da.

    Echt?

    jo, wenn man nicht absichtlichen mist programmiert 😉



  • Naja, du weisst was ich damit sagen wollte 😉

    Edit: Und dass man die Größe eines VLA nicht ungefiltert durch eine Usereingabe festlegt erklärt sich ja von selbst.


Anmelden zum Antworten