Я пишу расширение для postgres, которое включает создание нового базового типа переменной длины, однако у меня возникают трудности с пониманием семантики SET_VARSIZE.
Возьмите следующий пример кода, он точно не отражает мой вариант использования, но иллюстрирует суть.
typedef struct another_struct
{
char *a;
char *b;
} another_struct;
typedef struct test_struct
{
char vl_len_[4];
another_struct *data;
} test_struct;
1) При выделении памяти для новых экземпляров test_struct, предположительно, я могу просто сделать следующее, и это будет учитывать размер элемента переменной длины vl_len _?
test_struct *t = palloc0(sizeof(struct test_struct));
2) Поскольку оба члена another_struct имеют переменные длины, я предполагаю, что мне также нужно отслеживать, сколько памяти было выделено для обоих полей, чтобы передать правильную длину в SET_VARSIZE?
3) Нужно ли также учитывать размер указателя another_struct при вызове SET_VARSIZE?
Я думаю, что последний вызов SET_VARSIZE будет выглядеть примерно так
SET_VARSIZE(t, sizeof(struct test_struct) + sizeof(struct another_struct) + a_and_b_length);
Это близко к правильности? Извиняюсь за любые ошибки, я довольно плохо знаком с программированием на C.
Спасибо