То, что вы хотите сделать, невозможно по нескольким причинам.
Для начала, элемент name
структуры teststruct
представляет собой массив структур 20
varchar2
, а не одна varchar2
структура, которая содержит пространство для 20
символов.
Кроме того, структурный массив varchar2
содержит только один элемент, который не может содержать непустую байтовую строку с нулевым символом в конце.
Для решения ваших проблем вам нужно использовать указатели, гибкий элемент массива и динамическое c выделение с использованием malloc
.
Тогда вы можете есть что-то вроде
typedef struct
{
unsigned short len;
// Last member being an array without a size makes it a flexible array member
unsigned char arr[];
} varchar2;
struct teststruct
{
varchar2 *name;
};
varchar2 *create_varchar2(unsigned short length)
{
// Size of the structure itself, plus the size of the string,
// plus one for the null-terminator
varchar2 *string = malloc(sizeof *string + length + 1);
// TODO: Check for failure and handle it in some way
string->len = length;
return string;
}
varchar2 *create_varchar2_string(const char *str)
{
varchar2 *string = create_varchar2(strlen(str));
strcpy(string->arr, str);
return string;
}
int main(void)
{
teststruct obj;
obj.name = create_varchar2_string("hello");
printf("name = %s\n", obj.name->arr);
}
Затем вы можете добавить функции для изменения «строки», включая изменение ее размера.