- ベストアンサー
64bit系でのmalloc
こんにちは itanium2の乗っているマシンでcのプログラムをつくっています。 gccでコンパイルしているのですが、 warningが出てコンパイルができません。 以下のようなエラーです。 warning: cast to pointer from integer of different size 引っかかっている場所は、 double *ini=(double *)malloc(sizeof(double)*1000000); という場所です。配列iniのサイズが小さいうちは以下のように double ini[10000] とすれば、通るのですが、大きなメモリ領域を確保しようと mallocを使うと上のようなエラーが出て、コンパイルできません。 調べてみると、64ビット系で起こるエラーであるということは わかったのですが、回避の仕方がわかりません。 どなたかご存じの方がいらっしゃったらお教えください。 OSはレッドハット8でカーネルは2.4.24です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
1.stdlib.hをincludeする。 2. size_t asize = sizeof(double)*1000000; として、 double *ini=(double *)malloc(asize); としてみてください。 mallocの引数は、size_t型であり、 これは32ビットモードでは、int型と同じですが 64ビットモードでは8バイト整数型になります。
その他の回答 (1)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
うーん、それはmalloc.hをインクルードしていないか、コンパイル時に何かオプションを付け忘れているか、ターゲットがia64ではないインクルードファイルを使っているか、ように思えます。 そのメッセージは 「malloc()が返す値の型の幅」が「ポインタ(double*)の幅」と異なる という意味です。しかし、通常malloc()が返すのはvoid*なので、double*と幅が異なるはずがないんですよね。 インクルードし忘れであれば、mallocが最初に使われた場所でint malloc()と解釈され、intとdouble*の幅が異なるためメッセージが出ている、と考えられます。
お礼
回答をいただいて大変ありがとうございました。 No1さんのお話で、結局mallocの本当の 引数を理解していなかったことが原因でした。 32ビットでは、たまたま引数がintと同じであるため、 気がつかなかった事だったようです。
補足
ありがとうございます。 G5とpentiumマシンでは普通に動いていますので 64ビット特有の症状のようなのです。 malloc.hをインクルードする必要があるのですね。 ためしてみます。
お礼
大変的確なアドバイスをどうもありがとうございました。 うまく計算ができるようになりました。 mallocの本当の引数を理解しておりませんでした。 大変ありがとうございました!
補足
なるほど。試してみます。 また結果を報告します。