Я писал в этой теме ранее , но теперь у меня есть более конкретный вопрос / проблема.
Вот мой код:
#include <cstdlib>
#include <iostream>
typedef struct{
unsigned int h;
unsigned int b[];
unsigned int t;
} pkt;
int main(){
unsigned int* arr = (unsigned int*) malloc(sizeof(int) * 10);
arr[0] = 0xafbb0000;
arr[1] = 0xafbb0001;
arr[2] = 0xafbb0011;
arr[3] = 0xafbb0111;
arr[4] = 0xafbb1111;
arr[5] = 0xafbc0000;
arr[6] = 0xafbc0001;
arr[7] = 0xafbc0011;
arr[8] = 0xafbc0111;
arr[9] = 0xafbc1111;
pkt* p = (pkt*) malloc(sizeof(int)*13);
p->h = 0x0905006a;
int counter;
Вот что я получаю
для (счетчик = 0; счетчик <10; счетчик ++)
p-> b [counter] = arr [counter];
p->t = 0x55555555;
std::cout << "header is \n" << p->h << std::endl;
std::cout << "body is" << std::endl;
for(counter=0; counter < 10;++counter)
std::cout << std::hex << *((p->b)+counter) << std::endl;
std::cout << "trailer is \n" << p->t << std::endl;
}
Вот что я получаю
header is
151322730
body is
55555555
afbb0001
afbb0011
afbb0111
afbb1111
afbc0000
afbc0001
afbc0011
afbc0111
afbc1111
trailer is
55555555
* (p-> b) заменяется на прицеп! И если я удаляю строку, где я назначил трейлер, то есть p-> t = 0x55555555 ;, то трейлер и p-> b совпадают (afbb0000).
Итак, мой вопрос: как я могу сохранить структуру, определяющую наверху, как она есть, и правильно настроить этот пакет.
EDIT:
Я должен быть более ясным. Я пишу это для сетевого приложения, поэтому мне нужно создать пакет, в котором выходные данные будут в точном порядке, я проверяю это, записывая в файл и выполняя шестнадцатеричный дамп. Так что мой вопрос на самом деле:
Как сделать так, чтобы пакет с заголовком, телом переменного размера и трейлером всегда имел этот порядок? Единственные два решения, о которых я могу думать, - это иметь много разных структур или вектор.
То есть я мог бы определить, где
typedef struct{
unsigned int h;
unsigned int b[12];
unsigned int t;
} pkt1;
typedef struct{
unsigned int h;
unsigned int b[102];
unsigned int t;
} pkt2;
etc
или я мог бы сделать
std::vector<unsigned int> pkt (12);
pkt[0] = header;
pkt[1] = data;
...
pkt[2]= data;
pkt[11] = trailer;
Мне не очень нравится ни одно из этих решений. Есть ли лучший способ ??
Кроме того, это несколько отдельный вопрос, мне придется сделать то же самое для получения данных. Разумно сделать что-то вроде приведения блока данных к вектору? Я собираюсь получать данные как пустоту *, и я буду знать максимальную длину.