C:不能与void类型的右值初始化变量*

问题描述:

我有以下代码:C:不能与void类型的右值初始化变量*

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

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

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

谢谢。

+4

'int * numberArray =(int *)calloc(n,sizeof(int));'它叫做铸造。 – deviantfan

+0

在C++中,'malloc'和'calloc'需要类型转换。 –

+0

是否没有'calloc'的文档了? – juanchopanza

编译器的错误信息非常清楚。

返回值callocvoid*。您正在将其分配给类型为int*的变量。

这与C程序没关系,但与C++程序无关。

可以该行更改为

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

但是,一个更好的选择将是使用new运营商分配内存。毕竟,你正在使用C++。

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

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]; 

语法释放calloc是:

无效*释放calloc(为size_t NUM,为size_t大小);

calloc返回void指针。在你的代码中,你正试图将void指针指定给整数指针。所以你得到了无法初始化类型为'void *'的右值'int *'的变量。所以在指定它之前,先指定void指针

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