Pregunta

Necesito crear un paquete que tenga un encabezado, un avance y un campo de carga útil de longitud variable. Hasta ahora he estado usando un vector para la carga útil, por lo que mi estructura está configurada de esta manera:

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

Cuando intento acceder a los miembros del vector, aparece una falla seg y el tamaño de una estructura completa me da 32 (después de haber agregado aproximadamente 100 elementos al vector.

¿Es este un buen enfoque? ¿Qué es mejor?

Encontré esta publicación Struct C ++ de tamaño variable Estaba usando una matriz de caracteres, y yo estoy usando un vector.

¿Fue útil?

Solución

La solución en la otra respuesta SO es específica de c, y se basa en las peculiaridades de las matrices de c, e incluso en c, sizeof () no lo ayudará a encontrar el " verdadero " tamaño de una estructura de tamaño variable. Esencialmente, es trampa, y es un tipo de trampa que no es necesaria en C ++.

Lo que estás haciendo está bien. Para evitar fallas seg, acceda al vector como lo haría con cualquier otro vector en 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

Otros consejos

Aunque el tipo de vector está en línea en la estructura, el único miembro que está en el vector es probablemente un puntero. Agregar miembros al vector no aumentará el tamaño del tipo de vector en sí, sino la memoria a la que apunta. Es por eso que nunca verá el aumento del tamaño de la estructura en la memoria y, por lo tanto, obtendrá una falla seg.

Por lo general, cuando las personas desean crear una estructura de tamaño variable, lo hacen agregando una matriz como último miembro de la estructura y estableciendo su longitud en 1. Luego asignarán memoria adicional para la estructura que realmente requiere sizeof () para " expandir " la estructura. Esto casi siempre va acompañado de un miembro adicional en la estructura que detalla el tamaño de la matriz expandida.

La razón para usar 1 está completamente documentada en el blog de Raymond

vi esta implementación en boost ... se ve muy bien ... tener una variable longitud de carga útil ...

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

esto puede estar totalmente relacionado con la pregunta, pero quería compartir la información

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top