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