web-dev-qa-db-ja.com

C:void *型の右辺値で変数を初期化できません

私は次のコードを持っています:

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

また、次のエラーが表示される理由を理解できません。

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

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

12
user3662185

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

callocの戻り値はvoid*です。タイプint*の変数に割り当てています。

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

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

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

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

int* numberArray = new int[n];
19
R Sahu
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];
2
user2734982

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));
0
AK_

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

void * calloc(size_t num、size_t size);

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

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

0
Hussain