アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは
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です。

A 回答 (2件)

1.stdlib.hをincludeする。


2.
size_t asize = sizeof(double)*1000000;
として、
double *ini=(double *)malloc(asize);
としてみてください。

mallocの引数は、size_t型であり、
これは32ビットモードでは、int型と同じですが
64ビットモードでは8バイト整数型になります。

この回答への補足

なるほど。試してみます。
また結果を報告します。

補足日時:2005/09/30 23:38
    • good
    • 0
この回答へのお礼

大変的確なアドバイスをどうもありがとうございました。
うまく計算ができるようになりました。
mallocの本当の引数を理解しておりませんでした。
大変ありがとうございました!

お礼日時:2005/10/02 16:28

うーん、それはmalloc.hをインクルードしていないか、コンパイル時に何かオプションを付け忘れているか、ターゲットがia64ではないインクルードファイルを使っているか、ように思えます。



そのメッセージは

「malloc()が返す値の型の幅」が「ポインタ(double*)の幅」と異なる

という意味です。しかし、通常malloc()が返すのはvoid*なので、double*と幅が異なるはずがないんですよね。

インクルードし忘れであれば、mallocが最初に使われた場所でint malloc()と解釈され、intとdouble*の幅が異なるためメッセージが出ている、と考えられます。

この回答への補足

ありがとうございます。
G5とpentiumマシンでは普通に動いていますので
64ビット特有の症状のようなのです。
malloc.hをインクルードする必要があるのですね。
ためしてみます。

補足日時:2005/09/30 23:34
    • good
    • 0
この回答へのお礼

回答をいただいて大変ありがとうございました。
No1さんのお話で、結局mallocの本当の
引数を理解していなかったことが原因でした。
32ビットでは、たまたま引数がintと同じであるため、
気がつかなかった事だったようです。

お礼日時:2005/10/02 16:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!