доступ к 'typedef struct с массивом char' внутри другой структуры - PullRequest
0 голосов
/ 04 февраля 2020

Цель, которую я пытаюсь достичь, - создать структуру для чтения и записи Oracle VARCHAR2 тип данных. из базы данных и в нее. Поэтому я создал структуру C, как указано Oracle, и попытался записать данные в переменную, что мне не удалось. Я пытаюсь двумя разными способами, они дают разные массивы. Может кто-нибудь сказать мне, пожалуйста, что я делаю здесь неправильно и как это исправить, чтобы соответствовать моей цели.

#include<stdio.h>
#include<string.h>

typedef struct { unsigned short len; unsigned char arr[1]; } varchar2;

struct teststruct
{
        varchar2 name[20];
};

void main()
{
    struct teststruct obj;

    //error: request for member ‘arr’ in something not a structure or union
    strcpy( obj.name.arr, "adarsh" );

    //trying like this..
    //warning: initialization from incompatible pointer type [enabled by default]       
    struct varchar2 *ptr = ( varchar2* ) obj.name;
    //error: dereferencing pointer to incomplete type
    strcpy( ptr->arr, "name" );

}

1 Ответ

1 голос
/ 04 февраля 2020

То, что вы хотите сделать, невозможно по нескольким причинам.

Для начала, элемент 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);
}

Затем вы можете добавить функции для изменения «строки», включая изменение ее размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...