使用函数将解析后的 JSON 文件存储到结构体数组中?

问题描述 投票:0回答:1

我正在尝试构建一个客户端/服务器应用程序,该应用程序在客户端建立 TCP 连接并通过字符缓冲区发送解析后的 JSON 文件。但首先,我需要解析 JSON 文件,我正在使用 Jansson 库执行此操作并将其存储到结构数组中。这是我的结构:

#define DEFAULT_LENGTH 22

typedef struct {
    char key[DEFAULT_LENGTH];
    char value[DEFAULT_LENGTH];
} jsonLine;

为了模块化/分隔,我希望在 main 中动态分配数组,并将其地址传递给函数,然后该函数将在其中构建它。但是,它不起作用。这个问题不一定与 JSON 库有关,因为我尝试了 main 中的代码并且它工作得很好。

问题更多在于传递数组并构建它。这是我的代码:

int main(int argc, char *argv[]) {
    
    //parse given json file into struct
    if (argc < 2) {
        printf("missing JSON file in cmd line arg!");
        return EXIT_FAILURE;
    }
    jsonLine *config = (jsonLine*) malloc(11 * sizeof(DEFAULT_LENGTH)*2);
    parseconfig(&config, argv);

这是 parseconfig():(我不会展示全部内容,只是我认为会产生分段错误错误)

void parseconfig (jsonLine **arr, char *input[]) {

   //storing values in struct array
    strcpy((**arr).key,"server_ip_addr");
    strcpy((**arr).value,json_string_value(json_object_get(root, "server_ip_addr")));
    (*arr)++;
    strcpy((**arr).key,"UDP_src_port");
    strcpy((**arr).value,json_string_value(json_object_get(root, "UDP_src_port")));
    (*arr)++;
    strcpy((**arr).key,"UDP_dest_port");
    strcpy((**arr).value,json_string_value(json_object_get(root, "UDP_dest_port")));
    (*arr)++;
    strcpy((**arr).key,"TCP_dest_port_headSYN");
    strcpy((**arr).value,json_string_value(json_object_get(root, "TCP_dest_port_headSYN")));
    (*arr)++;
    strcpy((**arr).key,"TCP_dest_port_tailSYN");
    strcpy((**arr).value,json_string_value(json_object_get(root, "TCP_dest_port_tailSYN")));
    (*arr)++;
    strcpy((**arr).key,"TCP_port_preProb");
    strcpy((**arr).value,json_string_value(json_object_get(root, "TCP_port_preProb")));
    (*arr)++;
    strcpy((**arr).key,"TCP_port_postProb");
    strcpy((**arr).value,json_string_value(json_object_get(root, "TCP_port_postProb")));
    (*arr)++;
    strcpy((**arr).key,"UDP_packet_size");
    strcpy((**arr).value,json_string_value(json_object_get(root, "UDP_packet_size")));
    (*arr)++;
    strcpy((**arr).key,"inter_time");
    strcpy((**arr).value,json_string_value(json_object_get(root, "inter_time")));
    (*arr)++;
    strcpy((**arr).key,"UDP_train_size");
    strcpy((**arr).value,json_string_value(json_object_get(root, "UDP_train_size")));
    (*arr)++;
    strcpy((**arr).key,"UDP_TTL");
    strcpy((**arr).value,json_string_value(json_object_get(root, "UDP_TTL")));
    json_decref(root);

说实话,我不知道问题出在哪里,为了简单起见,可能只是将代码转移到主函数中。

c json pointers struct
1个回答
0
投票
jsonLine *config = (jsonLine*) malloc(11 * sizeof(DEFAULT_LENGTH)*2);
parseconfig(&config, argv);

这是为

11 * sizeof(typeof(22)) * 2
分配内存。问题是您分配的内存为 2x 乘以 11
int
,而不是 11
jsonLine
。正确的计算是:

constexpr auto config_count = 11;
jsonLine *config = malloc(config_count * sizeof *config);
© www.soinside.com 2019 - 2024. All rights reserved.