我有以下代码:
int *numberArray = calloc(n, sizeof(int));
我无法理解为什么会收到以下错误。
Cannot initialize a variable of type 'int *' with an rvalue of type 'void *'`.
谢谢。
答案 0 :(得分:15)
编译器的错误信息非常清楚。
calloc
的返回值为void*
。您将其分配给int*
类型的变量。
对于C程序来说没问题,但是没有C ++程序。
您可以将该行更改为
int* numberArray = (int*)calloc(n, sizeof(int));
但是,更好的选择是使用new
运算符来分配内存。毕竟,你正在使用C ++。
int* numberArray = new int[n];
答案 1 :(得分:2)
void* calloc (size_t num, size_t size);
分配和零初始化数组。 为num元素数组分配一个内存块,每个元素都有大小字节长,并将其所有位初始化为零。有效结果是分配(num * size)字节的零初始化内存块。
成功时,指向由函数分配的内存块的指针。 此指针的类型始终为void *,可以将其强制转换为所需类型的数据指针,以便可以取消引用。 如果函数未能分配所请求的内存块,则返回空指针。
总结一下,由于calloc
在内存分配成功时会返回void*
(通用指针),因此您必须在C ++中对其进行类型转换:
int *numberArray = (int*)calloc(n, sizeof(int));
如果是C,你仍然可以跳过此演员。
或者,使用new
作为:
int *numberArray = new int [n];
答案 2 :(得分:0)
您在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));
答案 3 :(得分:0)
calloc的语法是:
void * calloc(size_t num,size_t size);
calloc返回void指针。在您的代码中,您尝试将void指针分配给整数指针。所以你得到的是无法初始化类型&#39; int *&#39;的变量。使用类型&#39; void *&#39;的右值。所以在分配它之前对void指针进行类型转换
* numberArray =(int *)calloc(n,sizeof(int));