C: не удается инициализировать переменную с rvalue типа void*
у меня есть следующий код:
int *numberArray = calloc(n, sizeof(int));
и я не могу понять, почему я получаю следующую ошибку.
Cannot initialize a variable of type 'int *' with an rvalue of type 'void *'`.
спасибо.
4 ответов
сообщение об ошибке компилятора очень ясно.
возвращаемое значение 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, каждый из которых имеет размер байт, и инициализирует все его биты до нуля.Эффективным результатом является выделение блока памяти с нулевой инициализацией (num * size) байтов.
при успешном выполнении указатель на блок памяти, выделенный функцией. Тип этого указателя всегда void*, который может быть приведен к желаемому типу указателя данных, чтобы быть поддерживать удаление ссылок. Если функции не удалось выделить запрошенный блок памяти, возвращается нулевой указатель.
подводя итог, начиная с calloc
возвращает void*
(общий указатель) при успешном выделении памяти вам нужно будет ввести-cast его так в C++:
int *numberArray = (int*)calloc(n, sizeof(int));
если это был C, вы все равно можете пропустить этот бросок.
или new
as:
int *numberArray = new int [n];
вы используете стиль перераспределения памяти C в коде C++.
То, что вы хотите использовать new
в C++
таким образом, ваш код станет:
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:
недействительным* метода calloc (size_t в Нум, размер size_t);
calloc возвращает указатель void. В вашем коде , вы пытаетесь присвоить указатель на целочисленный указатель. Таким образом, вы не можете инициализировать переменную типа "int *" с rvalue типа " void*". Поэтому введите указатель void, прежде чем назначить его следующим образом
*numberArray = (инт *) с памятью(н, как sizeof(тип int));