Frage

Ich brauche ein Paket zu fertigen, die einen Header hat, einen Anhänger und ein Nutzlastfeld variabler Länge. Bisher habe ich einen Vektor für die Nutzlast wurde unter Verwendung von so meine Struktur festgelegt ist, wie dies oben:

struct a_struct{
 hdr a_hdr;
 vector<unsigned int> a_vector;
 tr a_tr;
};

Wenn ich den Zugriff auf Mitglieder des Vektors versuche ich einen Segmentation Fehler und eine sizeof eines ganzen structs erhalten geben Sie mir 32 (nachdem ich über 100 Elementen zu dem Vektor hinzugefügt haben.

Ist das ein guter Ansatz? Was ist besser?

Ich fand diesen Beitrag Variable Sized Struct C ++ Er war ein char-Array verwendet wird, und ich bin zwar ein Vektor verwendet wird.

War es hilfreich?

Lösung

Die Lösung in der anderen SO Antwort ist c-spezifisch, und stützt sich auf den Besonderheiten des c-Arrays - und sogar in c, sizeof () wird nicht helfen, die „wahre“ Größe einer variablen Größe Struktur zu finden. Im Wesentlichen ist es Betrug, und es ist eine Art von Betrug, die nicht notwendig ist in C ++.

Was Sie tun, ist in Ordnung. Um seg Fehler zu vermeiden, rufen Sie den Vektor wie jeder anderer Vektor in C ++:

a_struct a;
for(int i = 0; i < 100; ++i) a.a_vector.push_back(i);
cout << a.a_vector[22] << endl; // Prints 22

Andere Tipps

Auch wenn der Vektortyp in der Struktur inlined ist das einzige Element, das in dem Vektor ist wahrscheinlich ein Zeiger. Mitglieder zum Vektor Hinzufügen wird die Größe des Vektortyp sich nicht erhöhen, aber die Erinnerung, die er zeigt. Deshalb sollten Sie nicht immer die Größe der Struktur Anstiegs des Speichers sehen, und Sie somit einen seg Fehler bekommen.

Normalerweise, wenn Menschen eine variable Größe Struktur machen wollen, tun sie dies durch ein Array als das letzte Mitglied der Struktur hinzugefügt und Einstellung ist es Länge 1. Sie werden dann zusätzliche Speicher für die Struktur zuweisen, die tatsächlich von sizeof erforderlich ist (), um die Struktur zu „erweitern“. Dies ist fast immer durch ein zusätzliches Mitglied in der Struktur begleitet die Größe des erweiterten Array Detaillierung.

Der Grund für 1 verwendet, ist gründlich dokumentiert auf Raymond Blog

Ich sah diese Implementierung in boost..it sieht wirklich ordentlich ... eine Variable haben Länge Nutzlast ....

class msg_hdr_t 
{
   public:
   std::size_t             len;     // Message length
   unsigned int            priority;// Message priority
   //!Returns the data buffer associated with this this message
   void * data(){ return this+1; }  //
};

Dies kann auf die Frage völlig un-bezogen sein, aber ich wollte die Informationen teilen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top