gpt4 book ai didi

c - 访问另一个结构内的 'typedef struct with char array'

转载 作者:行者123 更新时间:2023-11-30 14:31:50 24 4
gpt4 key购买 nike

我试图实现的目标是构建一个结构来从数据库读取和写入 Oracle VARCHAR2 数据类型。。因此,我按照 Oracle 的规定创建了一个 C 结构,并尝试将数据写入变量,但我无法做到这一点。我尝试了两种不同的方式,它们给出了不同的数组。有人可以告诉我我在这里做错了什么,以及纠正它以实现我的目标的方法。

#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" );

}

最佳答案

由于多种原因,您想要做的事情是不可能的。

对于初学者来说,teststruct 结构的 name 成员是 20 varchar2 结构的数组,而不是包含 20 个字符的空间的单个 varchar2 结构。

此外,varchar2 结构数组仅包含单个元素,它不能容纳任何非空的以 null 结尾的字节字符串。

要解决您的问题,您需要使用指针,flexible array member以及使用 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);
}

然后您可以添加函数来修改“字符串”,包括更改其大小。

关于c - 访问另一个结构内的 'typedef struct with char array',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60052186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com