函数参数从启动的char *工作,但如果从char []转换则无效

时间:2019-05-03 09:46:46

标签: c

我有一个mqtt函数,该函数使用char *指针订阅主题。由于我只想订阅自己的设备ID,因此需要动态创建此指针的一部分。而且我真的无法成功。

我尝试动态创建一个array [],然后将整个数组转换为指针数组*,但没有成功。仅当我以char *形式静态定义指针时,该方法才有效。

这很有效:

char* topic="/mqtt_topic/myID/";
mqtt_subscribe(module_inst, topic, 0, SubscribeHandler);

下面的代码可以编译,看起来也不错,该函数也正在订阅该主题,但它对通过mqtt发送的数据没有反应。该字符串看起来也与上面的示例相同。

char topick []="/mqtt_topic/myID/";
char* topic=topick;
mqtt_subscribe(module_inst, topic, 0, SubscribeHandler);

mqtt_subscribe函数如下所示;

int mqtt_subscribe(struct mqtt_module *module, const char *topic, uint8_t qos, messageHandler msgHandler)
{
    int rc;

    rc = MQTTSubscribe(module->client, topic, qos, msgHandler);
    if(module->callback)
        module->callback(module, MQTT_CALLBACK_SUBSCRIBED, NULL);   

    return rc;
}

调用以下函数。

int MQTTSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos, messageHandler msgHandler)
{ 
    int rc = FAILURE;  
    Timer timer;
    int len = 0;
    MQTTString topic = MQTTString_initializer;
    int Qoss = (int) qos;
    topic.cstring = (char *)topicFilter;
#if defined(MQTT_TASK)
    MutexLock(&c->mutex);
#endif
    if (!c->isconnected)
        goto exit;

    TimerInit(&timer);
    TimerCountdownMS(&timer, c->command_timeout_ms);

    len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, (int*)&Qoss);
 //   len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, qos);
    if (len <= 0)
        goto exit;
    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet
        goto exit;             // there was a problem

    if (waitfor(c, SUBACK, &timer) == SUBACK)      // wait for suback 
    {
        int count = 0, grantedQoS = -1;
        unsigned short mypacketid;
        if (MQTTDeserialize_suback(&mypacketid, 1, &count, &grantedQoS, c->readbuf, c->readbuf_size) == 1)
            rc = grantedQoS; // 0, 1, 2 or 0x80 
        if (rc != 0x80)
        {
            int i;
            for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
            {
                if (c->messageHandlers[i].topicFilter == 0)
                {
                    c->messageHandlers[i].topicFilter = topicFilter;
                    c->messageHandlers[i].fp = msgHandler;
                    rc = 0;
                    break;
                }
            }
        }
    }
    else 
        rc = FAILURE;

exit:
#if defined(MQTT_TASK)
    MutexUnlock(&c->mutex);
#endif
    return rc;
}

这是预期的结果吗?有什么办法解决这个问题?

2 个答案:

答案 0 :(得分:5)

您给我们看的不够多。但是,我认为:

void myFunction(...)
{
    char topick []="/mqtt_topic/myID/";
    char* topic=topick;
    mqtt_subscribe(module_inst, topic, 0, SubscribeHandler);
    //...
}

或类似的内容,即topick在函数内部声明。然后,它是一个局部变量,当函数返回时,该局部变量将不复存在。指向您传递的字符串的指针不再指向有效的字符串。

另一方面:

char* topic="/mqtt_topic/myID/";
mqtt_subscribe(module_inst, topic, 0, SubscribeHandler);

这里topic指向一个文字,并且该文字在函数返回后仍然存在。因此mqtt_..函数会收到一个有效的字符串,该字符串在调用者返回后也将存在。

答案 1 :(得分:0)

您的答案是完全正确的,我的确是在本地声明数组。全局声明topick[64]可以解决此问题。

谢谢!

/ Mikael