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

C言語の初心者です。
Visual Studio 2013のコンソールアプリにて、以下の様な配列の確保が出来ません。
data_size=0x8000000; //2^27 なら確保できます。
どなたか解決方法を御存じの方ご教授お願いします。

main()
{
double *A;
unsigned int data_size=0x10000000; //2^28

A=(char*)malloc(sizeof(double)*data_size);
if(IoutD == NULL) {
printf("メモリが確保できません\n");
exit(EXIT_FAILURE);
}
}

A 回答 (2件)

「そんなアホなサイズを必要とするアルゴリズムを見直す」には完全に同意する (もちろん何ともならんこともある) が「型が違うのでエラー」はさすがに単純すぎ>#1.



規格上「あるオブジェクト型へのポインターを別のオブジェクト型へのポインターに変換する」ことは可能. しかも, 今の場合はアラインメントも大丈夫だからちゃんとこれで動いちゃう (ことが規格で保障されている).

ちなみに手元では (64bit の 2015 だけど) 動いた.
    • good
    • 0
この回答へのお礼

有難うございます。
64bitで動いたとの事朗報です。
試してみます。
アルゴリズムに関しては駄目な時には分割してハードディスク(SDD)とを行き来し演算する方法を考えようかと思っていますが未実行です。

お礼日時:2017/01/17 18:16

>どなたか解決方法を御存じの方ご教授お願いします。



そんなアホなサイズを必要とするアルゴリズムを見直す。

>double *A;
なのに
>A=(char*)malloc(sizeof(double)*data_size);
型が違うのでエラーです。

>if(IoutD == NULL) {
IoutDは宣言されていません。

>data_size=0x8000000; //2^27 なら確保できます。
コレでヒープ領域2Gをがっつり喰います。
>data_size=0x10000000; //2^28
なら計算上4Gです。
# sizeof(double) == 8の場合。

64Bitアプリなら行ける…のかなぁ………。
    • good
    • 0
この回答へのお礼

有難うございます。
if(IoutD == NULL) はタイプミスでif(A==NULL)です。
失礼しました。
なお、実際には形違いでエラーが出ていません?です。
A=(double*)malloc(sizeof(double)*data_size);でも結果は同じです。

お礼日時:2017/01/17 18:14

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