konstante attribute initialisieren (heap)



  • hallo leute,
    ich bin immer noch auf der suche nach einer standardkonformen lösung für das initialisieren eines konstanten attributs einer struct, die auf dem heap reserviert wurde.

    z.b. struct string { const size_t npos; };
    struct string * str = malloc( sizeof(struct string) );
    *(size_t *)&str->npos = -1;
    dies funktioniert mit msvc und gcc und erbringt den erwarteten effekt (die initialisierung).

    jetzt funktioniert jedoch folgendes (im analogieschluss) nicht:
    const size_t * npos = malloc( sizeof(size_t) );
    *(size_t *)npos = -1;
    führt mindestens auf msvc zu UB (auf gcc nicht getestet).

    Meine Frage: Ist erstes verfahren zum initialisieren einer konstanten struct variable so erwünscht (und auch so definiert nach c89 standard) oder wurde nur das normale verhalten beim initialisieren von constanten variablen für den struct fall von den kompilieren modifiziert(sonst würde nicht erstere methode gehen, zweite aber zu UB führen)?
    Bitte detaillierte antworten mit referenzen auf den standard.

    Gruß Krauzi.



  • Wozu soll das denn gut sein? Es ergibt doch gar keinen Sinn, ein konstantes Element eines Objektes immer auf denselben Wert zu setzen..



  • das ist eigentlich der sinn einer konstanten :D. wie man in meinem beispiel code sehen konnte, geht es um das attribut "npos" einer string struct. die ist für das vergleichen der rückgabe werte der string find funktionen gedacht und sollte als const deklariert werden, da ich damit zeigen will: das teil wird sich während des gesamten programm ablaufs nicht ändern.
    mir würde eine konkrete aussage zur standardkonformität ausreichen (bitte dann aber mit angabe der absätze).

    nochmal der code:

    struct string { const size_t npos; };
    struct string * str = malloc( sizeof(struct string) ); 
    *(size_t *)&str->npos = -1;
    


  • zur lösung des problems habe ich auf #c nachgefragt:
    1.) void * p = malloc(sizeof (struct string)); memcpy(p, &(struct string) { -1 }, sizeof (struct string)); struct string * str = p;
    2.) struct string * str = malloc( sizeof(struct string) ); memcpy(str, &(struct string) { -1 }, sizeof (struct string));

    meiner meinung nach sind beide aussagen äquivalent. laut einer person auf #c nicht. bitte erklärung oder bestätigung warum 1 <=> 2 ist oder eben nicht.



  • Noch einer, der genaue Kapitel genannt haben möchte. Scheint irgendwie eine Epidemie zu sein.

    Ein als const deklariertes Objekt kann nur bei der Definition einen Wert zugewiesen bekommen, d.h. bei der Initialisierung, alle anderen Versuche bedeuten eine constraint violation. Gemäß Standard soll der Compiler hierauf hinweisen muss aber nicht die Codeerzeugung abbrechen.
    Das gilt für struct-Elemente wie für andere Variablen, auf dem Stack oder sonstwo.
    Implizit oder explizite static Variablen sind sowieso immer 0-initialisiert.

    struct Typ { const int bla; int fasel; };
    
    struct Typ foo;
    
    int main() {
    
    struct Typ foo = {-1};
    

    Und deine Kapitel suchst du dir mal selbst raus.


Anmelden zum Antworten