Динамическое создание 2d массивов - PullRequest
0 голосов
/ 28 апреля 2011

Это ситуация, когда у меня есть функция, которая получает количество строк и столбцов луча, и я хочу динамически создать ее внутри функции.

#include <stdlib.h>

int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
    {
    fprintf(stderr, "out of memory\n");
    exit or return
    }
for(i = 0; i < nrows; i++)
    {
    array[i] = malloc(ncolumns * sizeof(int));
    if(array[i] == NULL)
        {
        fprintf(stderr, "out of memory\n");
        exit or return
        }
    }

это не работает, потому что в VS 2011 говорится, что массив = malloc (n * sizeof (int *)); void * не может быть назначен на int * Как мне это исправить?

1 Ответ

5 голосов
/ 28 апреля 2011

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 в одной и той же программе, но это не рекомендуется, поскольку вы можете легко забыть, какой из них выделил определенный блок памяти, и использовать для него неправильную функцию освобождения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...