如何通过函数将解析后的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
相关产品推荐
相关产品推荐

