1

すでにスタックオーバーフローにある構造体にメモリを割り当てることについていくつかの調査を行いましたが、見つけた答えはうまくいきませんでした。そうは言っても、ここに私の質問と問題があります。ほとんどの場合、それらの大部分は、私が現在持っているコードと同じビットを持っていました。私のコンパイラは私にエラーを出していますが。

問題: ポインター (構造体へのポインター) ではなく、構造体 (構造体の配列) にメモリを割り当てたいと考えています。以下は私の構造体の定義です。

 #define INIT_MEMO_SIZE

typedef struct Memo
{
   struct HugeInteger *F; 
   int length; 

}Memo; 

必要な解決策: memo 構造体内で、巨大な整数構造体の INIT_MEMO_SIZE 数の配列を動的に割り当てたいと考えています。

試行された解決策: 右下の「malloc」で、「エラー: タイプ 'void *' のエンティティを使用してタイプ 'HugeInteger *' のエンティティを初期化することはできません。これはキーワード「malloc」に赤で下線を引いています。コンパイラ使用されているのは Microsoft Visual Studio 2012 です

// Creates and initializes a Memo Struct
Memo *createMemo(void)
{ 
    HugeInteger *ptr = malloc(sizeof(HugeInteger) * INIT_MEMO_SIZE); 

    if(ptr == NULL)
        return NULL; 

} // End of *createMemo

質問: 何が間違っているのですか、または構造体の配列を割り当てる適切な方法は何ですか?

4

2 に答える 2

2

malloc は void* を返します。戻り値をキャストする必要があります。

 HugeInteger *ptr = (HugeInteger*)malloc(sizeof(HugeInteger) * INIT_MEMO_SIZE); 
于 2013-06-09T16:43:16.013 に答える
0

あなたのコメントは、このコードは「メモ構造体を作成して初期化する」と言っていますが、Memo struct. 実際、関数はそのような構造体を返しません (メモリの割り当てに失敗しない限り)。おそらく、次のようなものが必要です。

Memo *createMemo(void)
{ 
    Memo *memo = malloc(sizeof(Memo));

    if(memo == NULL)
        return NULL;

    memo->F = malloc(sizeof(struct HugeInteger) * INIT_MEMO_SIZE); 

    if(memo->F == NULL)
    { // Oops, memory allocation failed.
        free(memo);
        return NULL;
    }

    // other initialization here -- perhaps set memo->length 
    // to some sensible value
    memo->length = INIT_MEMO_SIZE;

    // and return the new memo
    return memo;
} // End of *createMemo

malloc一般的に言えば、 Cでの操作の結果を型キャストする必要はありません。したがって、率直に言って、コンパイラが文句を言っている場合、これは C++ としてコンパイルしていることを示唆しています。

ただし、キャストしないmallocと赤い下線が引かれ、それに関連する何らかの「エラー」が発生するとおっしゃっています。これは、あなたが見ているのはコンパイラエラーではなく、過度に熱心なエディターからの警告であることを示唆しています(Intellisense を介して、おそらく VS2012 が実装する SDL チェックと組み合わせて)。コンパイルする前に発行してください。

于 2013-06-09T18:12:10.250 に答える