Pergunta

Eu preciso criar um pacote que tem um cabeçalho, um reboque, e um campo de carga útil comprimento variável. Até agora eu tenho usado um vector para a carga por isso a minha estrutura é configurado como este:

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

Quando tento acessar membros do vetor eu recebo uma falha seg e uma sizeof de toda uma structs me dar 32 (depois de eu ter adicionado cerca de 100 elementos para o vetor.

Esta é uma abordagem bem? O que é melhor?

Eu encontrei este post Variável Sized Struct C ++ Ele estava usando uma matriz de char, e eu estou usando um vetor embora.

Foi útil?

Solução

A solução na outra resposta SO é específico-c, e conta com as peculiaridades de c matrizes - e até mesmo em c, sizeof () não irá ajudá-lo a encontrar o tamanho "verdadeiro" de um tamanho struct variável. Essencialmente, é batota, e é uma espécie de batota que não é necessário em C ++.

O que você está fazendo é bom. Para evitar falhas seg, acesso o vetor como faria com qualquer outro vector em 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

Outras dicas

Mesmo que o tipo de vector é embutido na estrutura, o único membro que está no vetor é provavelmente um ponteiro. Adicionar membros ao vetor não irá aumentar o tamanho do próprio tipo de vetor, mas a memória que ele aponta. É por isso que você nunca vai ver o tamanho do aumento struct na memória e, portanto, você recebe uma falha seg.

Normalmente, quando as pessoas querem fazer uma struct de tamanho variável, eles fazê-lo adicionando um array como o último membro da estrutura e defini-lo de comprimento para 1. Em seguida, irá alocar memória extra para a estrutura que é realmente necessário por sizeof (), a fim de "expandir" a estrutura. Isto é quase sempre acompanhada por um membro extra na estrutura detalhando o tamanho da matriz expandida.

A razão para usar 1 é completamente documentado no blog de Raymond

i viu essa implementação na aparência boost..it realmente puros ... ter uma variável carga útil comprimento ....

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

este pode ser totalmente un relacionados com a pergunta, mas eu queria compartilhar a informação

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top