我在C中创建了一个消息队列API,但是我遇到了receive方法的问题。我将char *消息(“BOB”)发送到消息队列并成功存储。然后我尝试接收消息,但失败了。
在mq_receive()内部,正确的消息出列,ret_val-> buf指向0x012f5754(“BOB”)。接下来,msg_ptr(最初为0x00000000)被分配0x012f5754。一切都按预期工作,直到程序返回main()。在main()中,receive_message仍为NULL。我期待它指向BOB的第一个字符0x012f5754。我究竟做错了什么?感谢。
//main.c
main(){
char* receive_message = NULL;
//message queue init ...
mq_send(msq_id, "BOB"); //this works correctly
mq_receive(msq_id, receive_message);
printf("return value: %p\n", receive_message);
}
//message_queue.c
mqd_t mq_receive(mqd_t mqdes, char *msg_ptr)
{
queue_t* ret_val;
q_attr* attr_ptr = (q_attr*)mqdes;
ret_val = dequeue(attr_ptr);
//all this works ret_val->buf points to BOB
msg_ptr = ret_val->buf;
return mqdes;
}
答案 0 :(得分:3)
参数在C中按值传递,您需要将receive_message
的地址传递给mq_receive()
:
mqd_t mq_receive(mqd_t mqdes, char **msg_ptr)
{
queue_t* ret_val;
q_attr* attr_ptr = (q_attr*)mqdes;
ret_val = dequeue(attr_ptr);
//all this works ret_val->buf points to BOB
*msg_ptr = ret_val->buf;
return mqdes;
}
并调用它:
mq_receive(msq_id, &receive_message);
答案 1 :(得分:0)
回答你在回复hmjd时发布的问题。有一种方法可以在不改变签名的情况下做你想做的事。
如果你改变了这个:
char* receive_message = NULL;
类似于:
char receive_message[1000];
然后,您可以使用strcpy
存储收到的消息的副本,而无需更改函数原型。但正如hmjd所说,没有传递双指针就没有办法修改指针本身。