次のコードがあります。
int *numberArray = calloc(n, sizeof(int));
また、次のエラーが表示される理由がわかりません。
Cannot initialize a variable of type 'int *' with an rvalue of type 'void *'`.
ありがとうございました。
次のコードがあります。
int *numberArray = calloc(n, sizeof(int));
また、次のエラーが表示される理由がわかりません。
Cannot initialize a variable of type 'int *' with an rvalue of type 'void *'`.
ありがとうございました。
コンパイラのエラー メッセージは非常に明確です。
の戻り値はcalloc
ですvoid*
。type の変数に代入していますint*
。
これは C プログラムでは問題ありませんが、C++ プログラムでは問題ありません。
その行を次のように変更できます
int* numberArray = (int*)calloc(n, sizeof(int));
ただし、より良い代替手段は、new
演算子を使用してメモリを割り当てることです。結局のところ、C++ を使用しています。
int* numberArray = new int[n];
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];
C++ コードで C メモリ再割り当てスタイルを使用しています。あなたが使いたいのはnew
C++です
したがって、コードは次のようになります。
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));
calloc の構文は次のとおりです。
void* calloc (size_t num, size_t size);
calloc は void ポインターを返します。あなたのコードでは、void ポインターを整数ポインターに割り当てようとしています。したがって、「void *」型の右辺値で「int *」型の変数を初期化できません。したがって、このように割り当てる前にvoidポインターを型キャストします
*numberArray = (int *) calloc(n, sizeof(int));