0

CでメッセージキューAPIを作成していますが、receiveメソッドに問題があります。char *メッセージ( "BOB")をメッセージキューに送信すると、正常に保存されます。次に、メッセージを受信しようとしますが、失敗します。

mq_receive()内で、正しいメッセージがデキューされ、ret_val-> bufが0x012f5754( "BOB")を指します。次に、msg_ptr(元々は0x00000000)に0x012f5754が割り当てられます。プログラムがmain()に戻るまで、すべてが期待どおりに機能します。main()では、receive_messageはまだNULLです。私はそれが0x012f5754であるBOBの最初の文字を指すことを期待していました。私は何が間違っているのですか?ありがとう。

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

2 に答える 2

3

receive_messageC では引数は値で渡されます。to のアドレスを渡す必要があります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);  
于 2012-07-17T15:52:38.837 に答える
0

hmjdへの返信として投稿された質問に答えるため。署名を変更せずに、やりたいことを実行する方法があります。

これを変更した場合:

char* receive_message = NULL;

次のようなものに:

char receive_message[1000];

次に、関数プロトタイプを変更せずに、受信したメッセージのコピーを保存できます。strcpyしかし、hmjdが言ったように、ダブルポインターを渡さずに、ポインター自体を変更する方法は実際にはありません。

于 2012-07-17T17:43:06.653 に答える