Question

Je dois créer un paquet qui a un en-tête, une remorque et un champ de données utiles de longueur variable. Jusqu'ici, j'ai utilisé un vecteur pour la charge, donc ma structure est configurée comme suit:

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

Lorsque j'essaie d'accéder aux membres du vecteur, je reçois une erreur de segmentation et une taille d'une structure entière en donne 32 (après avoir ajouté environ 100 éléments au vecteur.

Est-ce une bonne approche? Quoi de mieux?

j'ai trouvé ce post structure de taille variable C ++ Il utilisait un tableau de caractères et j'utilise cependant un vecteur.

Était-ce utile?

La solution

La solution dans l'autre réponse SO est spécifique à c et repose sur les particularités des tableaux c - et même dans c, sizeof () ne vous aidera pas à trouver le "vrai". taille d'une structure de taille variable. En gros, c'est de la triche, et c'est une sorte de triche qui n'est pas nécessaire en C ++.

Ce que vous faites est bien. Pour éviter les erreurs de segmentation, accédez au vecteur comme n'importe quel autre vecteur 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

Autres conseils

Même si le type de vecteur est en ligne dans la structure, le seul membre du vecteur est probablement un pointeur. L'ajout de membres au vecteur n'augmentera pas la taille du type de vecteur mais la mémoire vers laquelle il pointe. C'est pourquoi vous ne verrez jamais la taille de la structure augmenter en mémoire et vous aurez donc une erreur de segmentation.

Habituellement, lorsque des personnes souhaitent créer une structure de taille variable, elles le font en ajoutant un tableau en tant que dernier membre de la structure et en définissant sa longueur sur 1. Elles allouent ensuite de la mémoire supplémentaire pour la structure réellement requise par sizeof. () afin de "développer" la structure. Ceci est presque toujours accompagné d'un membre supplémentaire dans la structure détaillant la taille du tableau développé.

La raison de l’utilisation de 1 est documentée en détail sur le blog de Raymond

J'ai vu cette implémentation dans boost..it semble vraiment soigné ... d'avoir une variable longueur utile ....

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; }  //
};

cela peut être totalement sans rapport avec la question, mais je voulais partager l'info

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top