私は次の 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 には があるため、この問題は明らかです。#include
malloc
int
sizeof(int) < sizeof(int*)
sizeof(int)==sizeof(int*)
(また、未定義の動作のため、呼び出し規約が整数ではなくポインタを返すために異なるレジスタを使用した場合など、が当てはまるプラットフォームでも失敗する可能性があることにも注意してください)
のcomp.lang.c よくある質問議論しているエントリがありますなぜリターンをキャストするmalloc
必要がないのか、そして潜在的に悪いのか。