我正在尝试构建一个客户端/服务器应用程序,该应用程序在客户端建立 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);
说实话,我不知道问题出在哪里,为了简单起见,可能只是将代码转移到主函数中。
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);