19

次のコードがあります。

int *numberArray = calloc(n, sizeof(int));

また、次のエラーが表示される理由がわかりません。

Cannot initialize a variable of type 'int *' with an rvalue of type 'void *'`.

ありがとうございました。

4

4 に答える 4

36

コンパイラのエラー メッセージは非常に明確です。

の戻り値はcallocですvoid*。type の変数に代入していますint*

これは C プログラムでは問題ありませんが、C++ プログラムでは問題ありません。

その行を次のように変更できます

int* numberArray = (int*)calloc(n, sizeof(int));

ただし、より良い代替手段は、new演算子を使用してメモリを割り当てることです。結局のところ、C++ を使用しています。

int* numberArray = new int[n];
于 2014-06-15T08:18:47.133 に答える
2
void* calloc (size_t num, size_t size);

配列を割り当ててゼロ初期化します。それぞれ size バイトの長さの num 要素の配列にメモリ ブロックを割り当て、そのすべてのビットをゼロに初期化します。実際の結果は、ゼロで初期化された (num*size) バイトのメモリ ブロックの割り当てです。

成功すると、関数によって割り当てられたメモリ ブロックへのポインター。このポインターの型は常に void* であり、逆参照可能にするために目的の型のデータ ポインターにキャストできます。関数が要求されたメモリ ブロックの割り当てに失敗した場合は、null ポインターが返されます。

要約すると、メモリ割り当ての成功時に (ジェネリック ポインター) をcalloc返すためvoid*、C++ では次のように型キャストする必要があります。

int *numberArray = (int*)calloc(n, sizeof(int));

C の場合でも、このキャストをスキップできます。

または、次のように使用newします。

int *numberArray = new int [n];
于 2014-06-15T08:20:34.740 に答える
0

C++ コードで C メモリ再割り当てスタイルを使用しています。あなたが使いたいのはnewC++です

したがって、コードは次のようになります。

int n = 10; //n = size of your array
int *narray = new int[n];
for (int i = 0; i < n; i++)
    cout << narray[i];

または、C に戻ってキャストで calloc を使用することもできます。

int* numberArray = (int*)calloc(n, sizeof(int));
于 2014-06-15T08:19:44.703 に答える
0

calloc の構文は次のとおりです。

void* calloc (size_t num, size_t size);

calloc は void ポインターを返します。あなたのコードでは、void ポインターを整数ポインターに割り当てようとしています。したがって、「void *」型の右辺値で「int *」型の変数を初期化できません。したがって、このように割り当てる前にvoidポインターを型キャストします

*numberArray = (int *) calloc(n, sizeof(int));

于 2014-06-15T08:20:42.570 に答える