C:无法使用void *类型的右值初始化变量

时间:2014-06-15 08:10:01

标签: c pointers variable-initialization

我有以下代码:

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

我无法理解为什么会收到以下错误。

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

谢谢。

4 个答案:

答案 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));