1. ホーム
  2. c

[解決済み] なぜこのコードは64ビットアーキテクチャでセグメンテーションされ、32ビットでは正常に動作するのですか?

2022-09-07 08:01:13

質問

次のようなC言語のパズルを見つけました。

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

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

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

どのように解決するのですか?

キャストから int* へのキャストは、適切な #include の戻り値の型は malloc が想定されています。 int . IA-64 はたまたま sizeof(int) < sizeof(int*) があり、この問題を明白にしています。

(また、未定義の動作のため、プラットフォーム上であっても sizeof(int)==sizeof(int*) が真であるプラットフォームでも失敗する可能性があることに注意してください。)

comp.lang.c FAQ を説明するエントリがあります。 からの戻り値をキャストする理由 malloc は決して必要ではなく、潜在的に悪い .