7

最近、誰かの mmap コードを適応させようとしたところ、次のエラーに遭遇しました。(実際、彼らのコードについては少し疑わしいです。なぜなら、彼らは不必要なことをしているように見えるからです - 独自のページ整列メモリで MAP_FIXED を使用しようとしています。マンページでは、 addr 引数が Linux でこれを行う必要があるため、NULL で mmap を呼び出すことを提案しています。)したがって、少なくとも NULL アドレスで mmap の呼び出しをテストすると思います。ただし、gcc を変更したときに gcc がスローするエラーがよくわかりません。代入の左オペランドとして必要な左辺値を取得している間、彼らのコードは正常に機能します。

基本的に、彼らは次のことを行っていました。

    uint8_t * ptr = (uint8_t *)mem;
    if ((uint32_t)ptr % PAGE_SIZE)
    {
        ptr += PAGE_SIZE - ((uint32_t)ptr % PAGE_SIZE);
    }

mem は void * であり、malloc されたメモリへのアクセスです。

私はタイプキャストで多かれ少なかれ同じことを試みています:

    if ((uint32_t)mem % PAGE_SIZE)
    {   
        (uint8_t *)mem += PAGE_SIZE - ((uint32_t)mem % PAGE_SIZE); /* ERROR */
    }

だから私は頭が良くて、頭になかった変数を削除していると思っていました。タイプキャスティングがオフになっている理由を教えてもらえますか? 乾杯。

4

1 に答える 1

6

あなたが犯している間違いは次のとおりです。

(uint8_t *)mem += /* Anything.  */

キャストの結果に代入することはできません。キャストの結果は、元の式と同じ値ではありません

次のようにするのがどれほど奇妙かを考えてみてください。

(int) some_char_variable = 9999;

私も一度同じ理由で悩んだことがあります。

R..がコメントで述べているように、temp を使用し、結果を書き戻します。

mem = (void *) ( ( (uint8_t *) mem) + SOME_EXPRESSION );
于 2012-07-08T13:32:30.773 に答える