【问题标题】:change pointer inside a function更改函数内的指针
【发布时间】:2012-07-16 14:16:36
【问题描述】:

我正在用 C 语言创建一个消息队列 API,但是接收方法有问题。我将 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;
}

【问题讨论】:

  • 你必须使用指向指针的指针,而不仅仅是指针。

标签: c pointers pass-by-reference message-queue


【解决方案1】:

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

【讨论】:

  • 非常感谢,这解决了问题。在不改变 mq_receive() 的签名的情况下,有什么方法可以完成我想做的事情吗?
  • @mashrur,我不知道。
【解决方案2】:

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

如果你改变这个:

char* receive_message = NULL;

类似于:

char receive_message[1000];

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2020-08-12
    相关资源
    最近更新 更多