Visual C ++ - это компилятор C ++, и C ++ требует явного приведения void*
s, в отличие от C, который допускает неявное приведение void*
s.
Попробуйте
array = (int**)malloc(nrows * sizeof(int *));
Однако именно так вы бы поступили в C, и если позже вы решите изменить данные с int
s на какой-то объект, конструктор объекта не будет вызван, потому что вы использовали malloc
. Если вы хотите сделать это более удобным для C ++ способом, который работает для всех типов данных, вы должны использовать new
:
int** array = new int*[nrows];
for (int i = 0; i < nrows; ++i)
array[i] = new int[ncolumns];
Этот способ также избавляет вас от необходимости вычислять размер объекта с помощью n * sizeof(type)
.
Однако , если вы решите использовать malloc
для выделения блока памяти, вы должны использовать free
для его освобождения; и наоборот, если вы решите использовать new
для выделения блока памяти, вам нужно будет использовать delete
для его удаления ( Не забудьте использовать delete[]
для массивов и обычные delete
для не-массивов ). Использование delete
в блоке памяти malloc
или free
в блоке памяти new
приводит к неопределенному поведению. Причина этого в том, что malloc
выделяет память в куче , но new
выделяет память в free-store . Они могут случиться так же; на самом деле, некоторые реализации new
и delete
используют malloc
и free
под капотом, но это зависит от компилятора, поэтому никогда не делайте этого.
Обратите внимание, что вы можете использовать malloc
и free
в одной и той же программе, но это не рекомендуется, поскольку вы можете легко забыть, какой из них выделил определенный блок памяти, и использовать для него неправильную функцию освобождения.