このコードはなぜ 64 ビット アーキテクチャではセグメント違反になるのに、32 ビットでは正常に動作するのでしょうか? 質問する

このコードはなぜ 64 ビット アーキテクチャではセグメント違反になるのに、32 ビットでは正常に動作するのでしょうか? 質問する

私は次の C パズルに遭遇しました:

Q: 次のプログラムは IA-64 ではセグメント違反になるのに、IA-32 では正常に動作するのはなぜですか?

  int main()
  {
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
  }

64 ビット マシン上の のサイズは、intポインターのサイズと同じではない場合があることは知っています (intは 32 ビットで、ポインターは 64 ビットの可能性があります)。しかし、これが上記のプログラムとどのように関係するかはわかりません。何かアイデアはありますか?

ベストアンサー1

へのキャストは、適切な がなければ の戻り値の型が であると想定されるというint*事実を隠します。IA-64 には があるため、この問題は明らかです。#includemallocintsizeof(int) < sizeof(int*)

sizeof(int)==sizeof(int*)(また、未定義の動作のため、呼び出し規約が整数ではなくポインタを返すために異なるレジスタを使用した場合など、が当てはまるプラットフォームでも失敗する可能性があることにも注意してください)

comp.lang.c よくある質問議論しているエントリがありますなぜリターンをキャストするmalloc必要がないのか、そして潜在的に悪いのか

おすすめ記事