Поскольку данные должны быть непрерывными в памяти, необходимо распределить часть памяти нужного размера и более или менее вручную управлять ее содержимым. Возможно, вам лучше всего создать структуру, которая содержит «статическую» информацию и связанные с ней функции управления, которые выполняют управление памятью и предоставляют доступ к «динамическим» членам структуры:
typedef struct _serial {
size_t sz_a;
size_t sz_b;
char data[1]; // "dummy" array as pointer to space at end of the struct
} serial;
serial* malloc_serial(size_t a, size_t b) {
serial *result;
// malloc more memory than just sizeof(serial), so that there
// is enough space "in" the data member for both of the variable arrays
result = malloc(sizeof(serial) - 1 + a + b);
if (result) {
result->sz_a = a;
result->sz_b = b;
}
return result;
}
// access the "arrays" in the struct:
char* access_a(serial *s) {
return &s->data[0];
}
char* access_b(serial *s) {
return &s->data[s->sz_a];
}
Тогда вы можете сделать что-то вроде этого:
serial *s = ...;
memcpy(access_a(s), "hallo", 6);
access_a(s)[1] = 'e';
Также обратите внимание, что вы не можете просто присвоить один serial
другому, вам необходимо убедиться, что размеры совместимы, и скопировать данные вручную.