gpt4 book ai didi

c - 无法访问嵌套结构中的值

转载 作者:太空宇宙 更新时间:2023-11-04 07:07:10 25 4
gpt4 key购买 nike

我一直在研究一些不是我的 C 代码,并且在学习 C 的过程中。但是我现在卡住的代码对我来说有点太多了。我知道这对这里的专家来说是一个微不足道的问题。我拥有的是嵌套结构,我需要为其赋值。下面是代码:

结构:

struct _str{
char* s; /**< string as char array */
int len; /**< string length, not including null-termination */
};

typedef struct _str str;
typedef str* db_key_t;

typedef enum {
DB_INT, /**< represents an 32 bit integer number */
DB_BIGINT, /**< represents an 64 bit integer number */
DB_DOUBLE, /**< represents a floating point number */
DB_STRING, /**< represents a zero terminated const char* */
DB_STR, /**< represents a string of 'str' type */
DB_DATETIME, /**< represents date and time */
DB_BLOB, /**< represents a large binary object */
DB_BITMAP /**< an one-dimensional array of 32 flags */
} db_type_t;


typedef struct {
db_type_t type; /**< Type of the value */
int nul; /**< Means that the column in database has no value */
int free; /**< Means that the value should be freed */
/** Column value structure that holds the actual data in a union. */
union {
int int_val; /**< integer value */
long long bigint_val; /**< big integer value */
double double_val; /**< double value */
time_t time_val; /**< unix time_t value */
const char* string_val; /**< zero terminated string */
str str_val; /**< str type string value */
str blob_val; /**< binary object data */
unsigned int bitmap_val; /**< Bitmap data type */
} val;
} db_val_t;
typedef struct db_row {
db_val_t* values; /**< Columns in the row */
int n; /**< Number of columns in the row */
} db_row_t;
struct db_row;
typedef struct db_res {
struct {
db_key_t* names; /**< Column names */
db_type_t* types; /**< Column types */
int n; /**< Number of columns */
} col;
struct db_row* rows; /**< Rows */
int n; /**< Number of rows in current fetch */
int res_rows; /**< Number of total rows in query */
int last_row; /**< Last row */
} db_res_t;

我正在做的示例代码:

    #include "Util.h"
#include "cJSON.h"
int main(void)
{
char *json = "[{\"domain\":\"192.168.254.1\",\"username\":\"user1\",\"expires\":123},{\"domain\":\"192.168.254.2\",\"username\":\"user2\",\"expires\":123}]";


db_res_t *result = NULL;
int i=0;

i = parse_json_to_result(json, &result);
** I think accessing like below is fine, as we have pointer structs and val is not pointer so '.' **
printf("result0: %d",result->rows->values->val.int_val);
printf("result1: %d",result->rows->values->val.int_val);
return 1;
}

int parse_json_to_result(char *json, db_res_t** result)
{
cJSON *root,*record;
int recourdCount = 0;
int i=0;
int value=0;

root =cJSON_Parse(json);
recourdCount= cJSON_GetArraySize(root);
printf("array size: %d\n",recourdCount);

for(i=0;i<recourdCount;i++)
{
record = cJSON_GetArrayItem(root, i);
value = cJSON_GetObjectItem(record,"expires")->valueint;
printf("Fetched value: %d\n",value);
** The below line gives segmentation fault**
((*result)->rows->values)->val.int_val = value;
}
return 1;
}

我想为结构体赋值并按如下方式进行:

    ((*result)->rows->values)->val.int_val = value;

result 是指向指针的指针,所以首先我取消引用它,然后 rest 是指向结构的指针,所以使用'->',而 val 只是 struct so '.'

*result->rows->values->val.int_val = value;

当我按照上面的方式编写时,我遇到了编译错误,例如 row is not struct or union 和 val 相同。

在理解如何为这个长长的结构链赋值时,我几乎不需要任何帮助。

此外,我无法理解的一件事是,在我正在处理的代码中,行以行[0]、行[1] 的形式访问,但我没有在结构中看到数组声明。如何创建行数组?

谢谢

最佳答案

首先,评论者说得对,您需要初始化结果指针。如果它只是指向 NULL,你当然会发生段错误。

所以让我们的结果指向一些分配的内存

db_res_t *result = malloc(sizeof(db_res_it));

但我们还没有完成。请注意,result->rows 是指向另一个结构的指针。即使我们为结果结构分配了空间,它也只是为指向 db_row 结构的指针分配内存,而不是为 db_row 结构本身分配内存。所以我们需要确保行指针也被初始化。

result->rows = malloc(sizeof(db_row_t));

现在 db_row 中的值字段再次发生同样的事情。

result->rows->values = malloc(sizeof(db_val_t));

在我将这三行添加到您的程序并注释掉您原始帖子中未提供的函数调用后,我让您的程序在没有段错误的情况下运行。

至于您的其他问题,关于将行作为数组访问:在 C 中,这基本上是一个指针。 Hanno Binder 为您提供了很好的资源;这是需要理解的 C 语言的一个重要且基本的概念。

祝您学习之旅顺利!

关于c - 无法访问嵌套结构中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31727305/

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