2016-09-08 2 views
-3

J'ai la structure suivante:Comment calculer lors de l'exécution la valeur maximale autorisée avant le survol de type de données?

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

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

La taille variable est calculée en tant que telle:

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

Ma question est, étant donné un sizeof Some_Struct et Other_Struct dont la taille réelle dépend de la plate-forme, l'architecture et l'emballage, comment puis-je au moment de l'exécution déterminer le nombre maximum de n autorisé avant size survole?

+3

"en spécifiant [0] est indéfini." - Ce n'est pas tout à fait correct. Utilisez un _flexible array member_: 'Other_Struct e []'. Ce hack '[1]' est hérité et invoque un comportement indéfini dans C moderne. – Olaf

+0

Ceci est uniquement supporté par C99. C++ qui est étiqueté ne prend pas en charge les membres de groupe flexibles. – Zhro

+3

Avec les notes ci-dessus, je suppose qu'il est temps de poser à nouveau la question, est ce 'c' ou' C++ '? Ils ne sont pas la même langue et n'auront pas la même réponse. –

Répondre

0

Vous pouvez utiliser numeric_limits:

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

Ne serait-ce pas: 'uint32_t maximum_n = (std :: numeric_limits :: max() - sizeof (Some_Struct)) /sizeof (Autre_Struct);' – Zhro

+0

Ah, vous avez raison - j'ai mal compris votre équation. Je pensais que tu avais des parenthèses autour du 'sizeof'. – villapx

+0

Modifié pour correspondre à – villapx