0

一部の (すべてではない) 64 ビット Linux で、int 値 16が切り捨てられてゼロになるという奇妙な問題に直面しています。

  • 切り捨ては、int を void* にキャストし、再び int にキャストするためです (これは良い習慣ではないことを理解してください)。

    • 16 は 16 進数の 10 になり、 http: //qb64.net/wiki/index.php?title =%26B
    • void* は 64 ビット OS で 8 バイトですが、LSB しか推定できませんか?? これが原因ですか??もしそうなら、なぜこれはいつも簡単に再現できないのですか??

    • またはこれはビッグエンディアンによるものですか??

    • 以下のサンプルソースコード

サンプルソース

    int main() {
    int i = 0;
    void *ptr = NULL;
    printf("\nsizeof - void(*) : %d , int : %d", sizeof(void*), sizeof(int));

    for(i = 0; i < 20; i++) {
          ptr = &i;
          printf("\n%d", *((int*)ptr));
    }

    return 0;
    }
4

1 に答える 1

0

OPのコメントで参照されているドキュメントで説明されている問題を実証するには、コードを次のように変更します。

      ptr = &i;
      printf("\n%d", (int)ptr))

アドレスが変更されたことを確認するには、次の行を追加します。

      printf("\n%p", &i))

印刷された 2 つの値が異なることを確認します。

sizeof(void*)これはすべてとして大きいと仮定しますsizeof(int)

于 2012-10-23T17:35:55.897 に答える