gpt4 book ai didi

c - 函数参数从启动的 char* 开始工作,但如果从 char[] 转换而来则不行

转载 作者:太空宇宙 更新时间:2023-11-04 05:47:44 29 4
gpt4 key购买 nike

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

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

这是行之有效的方法:

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

下面的代码可以编译并且看起来没问题,该函数也订阅了主题,但它不会对通过 mqtt 发送的数据使用react。该字符串看起来也与上面的示例相同。

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;
}

这是预期的结果吗?有什么办法可以解决吗?

最佳答案

你没有向我们展示足够的东西。但是,我假设:

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_.. 函数接收到一个有效的字符串,该字符串在调用者返回后也存在。

关于c - 函数参数从启动的 char* 开始工作,但如果从 char[] 转换而来则不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55967234/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com