【发布时间】:2021-11-25 09:41:43
【问题描述】:
我有来自 hivemq 站点的 simpe MQTT 客户端应用程序:
MQTTClient client;
MQTTClient_create(&client, "ssl://xxx.s1.eu.hivemq.cloud:8883", "Client_1", MQTTCLIENT_PERSISTENCE_NONE, NULL);
int i = MQTTClient_setCallbacks(client, NULL, NULL, messageArrived, NULL);
在变量 m->c->connect_state 中设置回调时出现分段错误
MQTTClient.c 代码分段错误:
int MQTTClient_setCallbacks(MQTTClient handle, void* context, MQTTClient_connectionLost* cl, MQTTClient_messageArrived* ma, MQTTClient_deliveryComplete* dc)
{
int rc = MQTTCLIENT_SUCCESS;
MQTTClients* m = handle;
FUNC_ENTRY;
Thread_lock_mutex(mqttclient_mutex);
if (m == NULL || ma == NULL || m->c->connect_state != NOT_IN_PROGRESS)
...
}
【问题讨论】:
-
这与您昨天提出的问题有何不同? stackoverflow.com/questions/70101845/…
-
你需要检查这个
MQTTClient_create的结果,看看是否成功。 -
您已经被告知
m->c在您的其他问题中可能是NULL。您仍然不检查是否是这种情况。为什么? -
代码很混乱:
MQTTClient是结构体。您传递整个结构,然后调用它handle。然后将其分配给MQTTClients指针。MQTTClients与MQTTClient的类型是什么?代码可以编译吗? -
MQTTClient_setCallbacks中的可疑分配不是罪魁祸首,而是传递给该函数的参数之一。这就是为什么我说你需要检查MQTTClient_create的结果才能看到它没问题。同样,一旦进入MQTTClient_setCallbacks,您应该能够检查m并在那里获取整个结构 - 成员变量应该设置为有意义的东西。