Динамическое распределение (malloc) непрерывного блока памяти - PullRequest
1 голос
/ 12 февраля 2010

Для назначения я должен выделить непрерывный блок памяти для структуры, но сначала я пытаюсь сделать это с помощью двумерного массива целых и посмотреть, правильно ли я понимаю У нас был пример из книги, который создает блок памяти для массива указателей (строк), а затем инициализирует столбцы и указывает на них указатель. Этот пример был:

int **CreateInt2D(size_t rows, size_t cols)
{
    int **p, **p1, **end;
    p = (int **)SafeMalloc(rows * sizeof(int *));
    cols *= sizeof(int);
    for (end = p + rows, p1 = p; p1 < end; ++p1)
        *p1 = (int *)SafeMalloc(cols);
    return(p);
}

void *SafeMalloc(size_t size)
{
    void *vp;

    if ((vp = malloc(size)) == NULL) {
        fputs("Out of mem", stderr);
        exit(EXIT_FAILURE);
    }
    return(vp);
}

Мне в основном нужно делать то, что делает приведенный выше код, за исключением того, чтобы сделать его одним непрерывным блоком памяти. Ограничением является то, что мне разрешено вызывать malloc только один раз, а затем я должен использовать указатель math, чтобы знать, на что инициализировать указатели. Поэтому я подумал, что инициализирую достаточно памяти чем-то вроде:

int *createInt2D(size_t rows, size_t cols) 
{
    malloc(rows * sizeof(int *) + (row + cols) * sizeof(int));
}

Но это не совсем правильно, так как я думаю, что мне нужно будет ввести void *, возвращенный из malloc, но это сочетание int и int *. Так что я не совсем уверен, что я на правильном пути. Мысли?

Ответы [ 4 ]

2 голосов
/ 12 февраля 2010

Если вы хотите непрерывный массив, вы должны malloc(rows * cols * sizeof(int)).

Тогда вы получите доступ к arr[x, y] как:

arr[x * cols + y]
1 голос
/ 18 октября 2011
malloc((row * cols) * sizeof(int));

Это строка * столбцы, которые представляют собой количество элементов в массиве 2D, а не строка + столбцы.

1 голос
/ 12 февраля 2010

Вы на правильном пути. Блок, возвращаемый функцией malloc, гарантированно будет правильно выровнен для int * или int; Вы можете использовать его для любого. Типирование не является одноразовой операцией.

Если вы собираетесь использовать исключительно адресацию array[row, col], вы можете обойтись без выделения дополнительного места для указателей строк. Если вы хотите использовать array[row] для получения списка столбцов int *, вам нужно будет включить место для указателей столбцов в вашем выделении.

Надеюсь, этого будет достаточно, чтобы помочь вам с тренировкой.

0 голосов
/ 12 февраля 2010

Не нужно умножать на размер int *. Это используется только для выделения указателей для строк. То же самое с суммой строк и столбцов. Достаточно выделить (строки * столбцы) * размер любой структуры.

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