私は次のコードを持っています:
int *numberArray = calloc(n, sizeof(int));
また、次のエラーが表示される理由を理解できません。
Cannot initialize a variable of type 'int *' with an rvalue of type 'void *'`.
ありがとうございました。
コンパイラのエラーメッセージは非常に明確です。
calloc
の戻り値はvoid*
です。タイプ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);
配列を割り当て、ゼロで初期化します。 num要素の配列にメモリブロックを割り当てます。各要素はsizeバイト長であり、そのすべてのビットをゼロに初期化します。効果的な結果は、(num * size)バイトのゼロ初期化メモリブロックの割り当てです。
成功した場合、関数によって割り当てられたメモリブロックへのポインタ。このポインターのタイプは常にvoid *であり、逆参照可能にするために、目的のタイプのデータポインターにキャストできます。関数が要求されたメモリブロックの割り当てに失敗した場合、nullポインタが返されます。
要約すると、calloc
はメモリ割り当てが成功するとvoid*
(汎用ポインタ)を返すため、C++では次のように型キャストする必要があります。
int *numberArray = (int*)calloc(n, sizeof(int));
Cの場合でも、このキャストをスキップできます。
または、new
を次のように使用します:
int *numberArray = new int [n];
C++コードでCメモリの再割り当てスタイルを使用しています。あなたが使いたいのはC++のnew
です
したがって、コードは次のようになります。
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));