最近、誰かの 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 */
}
だから私は頭が良くて、頭になかった変数を削除していると思っていました。タイプキャスティングがオフになっている理由を教えてもらえますか? 乾杯。