无法访问嵌套结构中的值

时间:2015-07-30 14:59:51

标签: c arrays pointers struct

我一直在研究一些不是我的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;

结果是指针的指针,所以首先我取消引用它然后休息是指向结构的指针,所以使用' - &gt;'和val只是结构所以'。'

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

当我上面写的时候,我得到了编译错误,比如 row不是struct或union ,而val也是如此。

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

另外,我无法理解的一件事是,在我正在使用的代码中,行被作为rows [0],rows [1]访问,但我没有在结构中看到数组声明。如何创建行数组?

由于

1 个答案:

答案 0 :(得分:3)

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

因此,让我们的结果指向一些已分配的内存

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

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

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

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

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

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

至于你的另一个问题,关于以数组的形式访问行:在C中,这基本上是一个指针。 Hanno Binder为您提供了良好的资源;这是C要理解的重要和基础概念。

祝你学习愉快!