Método para fazer um struct tamanho variável
-
06-07-2019 - |
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.
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