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

使用Jansson库在C语言中创建JSON对象并通过Paho MQTT C客户端发送时出现段错误的问题排查

解决Paho C客户端发送JSON消息时的段错误问题

嘿,我能帮你找出问题所在啦!你遇到的段错误,核心原因是Jansson的json_pack函数里,格式说明符和变量类型完全不匹配,导致程序错误地访问了非法内存区域。

问题分析

你在json_pack里用了s:s格式,但这个格式是用来处理**字符串类型(char*)**的键值对。而你的变量timestamp是long int类型,temperature、D850、D280都是float类型——把数字类型传给字符串格式符,会让Jansson尝试把数字当作字符串指针去读取,这必然会触发内存访问错误,也就是你看到的段错误。

修正后的代码

我们需要把格式说明符改成对应变量类型的:

  • l 对应 long int 类型
  • f 对应 float 类型

修正后的完整核心代码如下:

#include <stdio.h>
#include <jansson.h>

int main(int argc, char* argv[]) {
    // ..... 创建客户端 ....
    // 创建JSON
    long int timestamp = 1609446771;
    float temperature = 30.14;
    float D850 = 102.48;
    float D280 = 4845.84;
    
    // 注意这里的格式符:l对应long int,f对应float
    json_t *obj = json_pack("{s:l,s:f,s:f,s:f}", 
        "timestamp", timestamp, 
        "temperature", temperature, 
        "D850", D850, 
        "D280", D280);
    
    if (!obj) {
        fprintf(stderr, "Failed to create JSON object\n");
        return 1;
    }
    
    // 将JSON对象转换为字符串,用于MQTT发送
    char *json_msg = json_dumps(obj, JSON_COMPACT); // JSON_COMPACT生成紧凑的无格式字符串,适合网络传输
    if (!json_msg) {
        fprintf(stderr, "Failed to dump JSON to string\n");
        json_decref(obj);
        return 1;
    }
    
    // .... 发布消息:用json_msg作为MQTT的payload ....
    // 示例:MQTTClient_publish(client, topic, strlen(json_msg), json_msg, QOS, retained, &token);
    
    // 记得释放内存,避免泄漏
    free(json_msg);
    json_decref(obj);
    
    // ..... 其他客户端清理操作 ....
    return 0;
}

额外注意事项

  1. 内存管理:Jansson的对象需要用json_decref释放,json_dumps生成的字符串需要用free释放,不然会有内存泄漏。
  2. 编译参数:如果你的Jansson头文件不在系统默认路径,编译时需要加上-I参数指定头文件目录,比如:
    gcc -I/home/MYUSER/jansson/include -L/home/MYUSER/MQTT/paho.mqtt.c/build/output pahocclient.c -lpaho-mqtt3c -ljansson -lm -o publish_c.out
    

这样修正后,程序应该就能正常运行,不会再出现段错误啦!

内容的提问来源于stack exchange,提问作者Shahriar.M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:22:28