Schnelles installieren einer struktur



  • Hi,
    ich weiß dass man sowas normalerweise nicht macht aber ich frage mal so kann man folgendes gefahrlos machen ?

    typedef struct Foo{
            char x[10];
            char y[20];
    
    }Foo;
    
    void init(){
        Foo * f = malloc(sizeof(Foo));
        const char xx[30] = "..." // hier ein String mit 30 zeichen
        memcpy(f->x,y,30);
    ...
    }
    

    Wie schon gesagt, ich weiß dass man das so nicht tun sollte!
    Aber kann ich gefahrlos in das nächste Array schreiben oder hängt dies vom Zufall ab?



  • kommt halt darauf an, ob und wie das vom compiler optimiert wird, weil die reihenfolge der daten in der struktur im quelltext nicht der reihenfolge im speicher entsprechen muss.

    sprich du müsstest das überprüfen und könntest dann glück haben.



  • Wade1234 schrieb:

    kommt halt darauf an, ob und wie das vom compiler optimiert wird, weil die reihenfolge der daten in der struktur im quelltext nicht der reihenfolge im speicher entsprechen muss.

    Das ist Quatsch.

    ISO/IEC 9899:1999 (E) §6.5.8 (5) schrieb:

    [...] If the objects pointed to are members of the same aggregate object, pointers to structure members declared later compare greater than pointers to members declared earlier in the structure, [...]


  • Mod

    Wade1234 schrieb:

    kommt halt darauf an, ob und wie das vom compiler optimiert wird, weil die reihenfolge der daten in der struktur im quelltext nicht der reihenfolge im speicher entsprechen muss.

    Muss sie sehr wohl. Was prinzipiell vorstellbar wäre, ist eine Lücke zwischen x und y. Es dürfte zwar in der Praxis ziemlich schwierig sein, einen Compiler zu finden, der zwischen char-Arrays Padding einfügt, aber in der striktesten Auslegung des Standards ist es hier möglich. Vorstellbar wäre, dass ein vectorisierender Compiler striktere Vorschriften für das Alignment eines Arrays haben könnte als für das Alignment eines einzelnen chars.



  • Vielleicht sollte ich noch sagen worum es geht:
    Ich kriege eine Datenstrom mit einer fixen länge
    und ich würde gerne die Struktur in einem Schritt initialisieren und nicht über das zerlegen des Stroms.

    Aber wenn ich das so lese, ist dies gefahrlos nicht möglich


  • Mod

    kpC-dxf schrieb:

    Aber wenn ich das so lese, ist dies gefahrlos nicht möglich

    Nur wenn du frommer als der Papst bist und auch willst, dass der Code auch in 25 Jahren noch auf exotischen Maschinen funktioniert. Auf üblichen Systemen wird das heute problemlos funktionieren.

    Fast jeder Compiler kennt auch inoffizielle Pragmas, um Padding zu unterbinden. Ist dann halt auch nicht portabel auf exotische Systeme, aber du hast garantiert, wenn sie das verstehen, wird es auch funktionieren.



  • Du kannst dem Compiler bezüglich des Paddings Anweisungen geben.
    IN VS wäre es in dem Fall

    #pragma pack(push, 1) // auf 1 Byte ausrichten
    struct Foo
    {
    }; 
    #pragma pack(pop) // auf Ursprungswert zurücksetzen
    

    Du musst halt schauen, wie es bei deinem Compiler aussieht.

    Ansonsten kannst du dir die Ausruchtung auch mit offsetof anschauen.


Anmelden zum Antworten