LINUX.ORG.RU

[ручник] Работа с структурами неравной длины


0

1

Залип на ручнике. Как грамотно работать со структурами вида:

|type(16 bit)|length(16 bit)|data(length)|

нужно их читать, обрабатывать и в таком же виде писать обратно. Связный список городить что-то неохота. т.е. хвост структуры может быть до 64К байт(но обычно там от силы 100 байт).

делать unsigned char* data[65536] мне жаба не позволяет.

Как обычно, читаешь структуру из двух 16битных слов, читаешь остаток. Какие проблемы?

mashina ★★★★★
()

Так, что ли?

typedef struct{
uint16_t type;
uint16_t length;
char *data;
} Mystruct;

...
Mystruct *alloc_mystruct(uint16_t size){
Mystruct struct = calloc(1, sizeof(Mystruct);
struct->length = size;
struct->data = calloc(size, sizeof(char));
return struct;
}

void free_mystruct(Mystruct **struct){
if(!*struct) return;
free(*struct->data);
free(*struct);
*struct = NULL;
}

...

Mystruct *array[100];
for(int i =0; i < 100; i++)
array[i] = alloc_mystruct(rand()/1024); // инициализируем
...
работаем со структурами
...
for(int i =0; i < 100; i++)
free_mystruct(&array[i]); // очищаем
...
Eddy_Em ☆☆☆☆☆
()
Ответ на: Так, что ли? от Eddy_Em

Кстати, можно еще так сделать: выделить сразу malloc'ом или calloc'ом sizeof(Mystruct) + size*sizeof(type) данных, указатель *data принять равным адресу структуры + ее sizeof, дописать функции вычисления размера (sizeof(Mystruct) + size*sizeof(type)) в байтах и тогда можно будет спокойно сохранять эту структуру в бинарник и читать оттуда (только после прочтения нужно будет скорректировать указатель data).

Получите эдакий malloc, «запоминающий» тип и размер данных.

Eddy_Em ☆☆☆☆☆
()

Объявляешь структуру

struct XXX {

ushort type;
ushort length;
char data[0];

};

Память выделяешь динамически. Размер — sizeof(struct XXX) + length. К данным обращаешься как

struct XXX a;
a.data[i] = ...


ЗЫ Насколько помню в Си++ поля нулевого размера стандартом запрещены. Хотя большинство компиляторов поддерживают. Насчет чистого Си не помню. Для пущей совместимости лучше писать не «char data[0];», а «char data[1];»

Burbaka ★★
()
Ответ на: комментарий от twosev

Лучше использовать 'flexible array member' как там написано, с99.

mashina ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.