C 更改函数内的指针

C 更改函数内的指针,c,pointers,pass-by-reference,message-queue,C,Pointers,Pass By Reference,Message Queue,我正在用C编写一个消息队列API,但是我在receive方法上遇到了问题。我向消息队列发送了一个char*消息(“BOB”),它被成功存储。然后我尝试接收消息,但失败了 在mq_receive()内部,正确的消息将退出队列,ret_val->buf指向0x012f5754(“BOB”)。接下来,为msg_ptr(最初为0x00000000)分配0x012f5754。在程序返回main()之前,一切都按预期工作。在main()中,receive_消息仍然为空。我希望它指向BOB的第一个字符0x01

我正在用C编写一个消息队列API,但是我在receive方法上遇到了问题。我向消息队列发送了一个char*消息(“BOB”),它被成功存储。然后我尝试接收消息,但失败了

在mq_receive()内部,正确的消息将退出队列,ret_val->buf指向0x012f5754(“BOB”)。接下来,为msg_ptr(最初为0x00000000)分配0x012f5754。在程序返回main()之前,一切都按预期工作。在main()中,receive_消息仍然为空。我希望它指向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;
}

参数在C中按值传递,您需要将
receive\u message
的地址传递到
mq\u receive()

并调用它:

mq_receive(msq_id, &receive_message);  

参数在C中按值传递,您需要将
receive\u message
的地址传递到
mq\u receive()

并调用它:

mq_receive(msq_id, &receive_message);  

回答您在回复hmjd时提出的问题。有一种方法可以在不改变签名的情况下做你想做的事情

如果您更改此选项:

char* receive_message = NULL;
例如:

char receive_message[1000];

然后,您可以使用
strcpy
存储收到消息的副本,而无需更改函数原型。但正如hmjd所说,如果不传入双指针,就无法修改指针本身。

回答您在hmjd上发布的问题。有一种方法可以在不改变签名的情况下做你想做的事情

如果您更改此选项:

char* receive_message = NULL;
例如:

char receive_message[1000];

然后,您可以使用
strcpy
存储收到消息的副本,而无需更改函数原型。但是正如hmjd所说,如果不传入双指针,就无法修改指针本身。

非常感谢,这解决了问题。在不更改mq_receive()的签名的情况下,在哪里可以实现我想做的事情?@mashrur,我不知道。非常感谢,这解决了问题。是在不更改mq_receive()的签名的情况下实现我想要做的事情的某种方法?@mashrur,我不知道。您必须使用指针到指针,而不仅仅是指针。您必须使用指针到指针,而不仅仅是指针。