You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过函数将解析后的JSON存入结构体数组(现遇段错误)

问题分析与修复方案

核心问题1:内存分配计算完全错误

你在main中的malloc语句逻辑错误:

jsonLine *config = (jsonLine*) malloc(11 * sizeof(DEFAULT_LENGTH)*2);

DEFAULT_LENGTH是预编译宏定义的22,sizeof(DEFAULT_LENGTH)实际取的是int类型的大小(通常4字节),而非你预期的字符数组长度。正确的分配方式应该按结构体本身的大小计算:

// 分配能容纳11个jsonLine结构体的内存
jsonLine *config = malloc(11 * sizeof(jsonLine));
// 注:C标准中无需强制转换malloc的返回值

核心问题2:二级指针的不当操作

你在parseconfig中通过(*arr)++移动指针,会直接修改main函数里config指针的指向。函数返回后,main中的config会指向数组末尾,后续访问必然越界。更安全的做法是改用数组下标访问:

修改parseconfig实现:

void parseconfig (jsonLine *arr, char *input[]) {
    // 假设root已通过JSON解析正确初始化
    int idx = 0;

    // 填充第一个字段
    strcpy(arr[idx].key,"server_ip_addr");
    const char* val = json_string_value(json_object_get(root, "server_ip_addr"));
    if (val) strncpy(arr[idx].value, val, DEFAULT_LENGTH-1);
    arr[idx].value[DEFAULT_LENGTH-1] = '\0'; // 确保字符串终止
    idx++;

    // 填充UDP_src_port字段
    strcpy(arr[idx].key,"UDP_src_port");
    val = json_string_value(json_object_get(root, "UDP_src_port"));
    if (val) strncpy(arr[idx].value, val, DEFAULT_LENGTH-1);
    arr[idx].value[DEFAULT_LENGTH-1] = '\0';
    idx++;

    // 剩余字段按此逻辑依次填充...

    json_decref(root);
}

同时main中调用时直接传指针即可,无需传地址:

parseconfig(config, argv);

额外安全补充

  • 用strncpy替代strcpy,避免JSON值长度超过DEFAULT_LENGTH导致缓冲区溢出
  • 必须检查json_string_value的返回值:如果JSON中不存在对应键,它会返回NULL,直接调用strcpy会触发段错误
  • 分配内存后要检查malloc是否成功:
if (!config) {
    perror("malloc failed");
    return EXIT_FAILURE;
}

为什么之前在main中运行正常?

因为在main中你直接操作数组指针,既没有错误的内存计算,也不会因二级指针操作打乱指针指向,内存访问处于合法范围。

内容的提问来源于stack exchange,提问作者taiyosson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:28:32