2016-09-08 1 views
-3

Ich habe die folgende Struktur:Wie berechne ich zur Laufzeit den maximal erlaubten Wert vor dem Datentyp Rollover?

uint32_t size = sizeof(Some_Struct) + sizeof(Other_Struct) * n;

Meine Frage ist, da ein sizeof Some_Struct und Other_Struct tatsächliche Größe ist abhängig, die auf dem:

struct Some_Struct { 
    uint32_t a; 
    int16_t b; 
    uint8_t c; 
}; 

struct Other_Struct { 
    uint32_t a; 
    uint32_t b; 
    uint32_t c; 
}; 

Die variable Größe als solche berechnet wird Plattform, Architektur und Verpackung, wie kann ich zur Laufzeit die maximale Anzahl von n erlaubt vor size rollt über bestimmen?

+3

"als Angabe [0] ist nicht definiert." - Das stimmt nicht ganz. Verwenden Sie ein _flexibles Array member_: 'Other_Struct e []'. Dieser '[1]' Hack ist Legacy und ruft undefiniertes Verhalten in modernen C auf. – Olaf

+0

Dies wird nur von C99 unterstützt. C++, das markiert ist, unterstützt auch keine flexiblen Array-Mitglieder. – Zhro

+3

Mit den obigen Notizen denke ich es ist Zeit, die Frage noch einmal zu stellen, ist dies "C" oder "C++"? Sie sind nicht die gleiche Sprache und werden nicht die gleiche Antwort haben. –

Antwort

0

können Sie numeric_limits verwenden:

uint32_t maximum_n = (std::numeric_limits<uint32_t>::max() - sizeof(Some_Struct)) 
           /sizeof(Other_Struct); 
+0

Wäre es nicht: 'uint32_t maximum_n = (std :: numeric_limits :: max() - sizeof (Some_Struct)) /sizeof (Andere_Struct);' – Zhro

+0

Ah, du hast recht - ich habe deine Gleichung missverstanden. Ich dachte, du hättest Klammern um die "Größe". – villapx

+0

Bearbeitet um zu passen – villapx

Verwandte Themen