перераспределить структуру, c - PullRequest
3 голосов
/ 16 августа 2011

У меня есть следующая структура

struct Board
{
    int width;
    int height;
    char **board;
}

И я хотел бы расширить ** плату, что означает, что мне нужно больше памяти и, следовательно, вызов realloc ().Итак, мой вопрос: как мне это сделать - должен ли я вызывать realloc () для каждой строки в массиве отдельно и вызывать его для всей структуры?Спасибо!

Ответы [ 4 ]

1 голос
/ 16 августа 2011

Вызовите realloc для board, чтобы увеличить количество элементов на 1, а затем вызовите malloc для board[height] (при условии, что высота является первым измерением), чтобы добавить новую строку

0 голосов
/ 16 августа 2011

Если вы можете предсказать, сколько памяти вам нужно, лучше всего вызвать ее один раз. В противном случае это может сильно замедлить все суффиксы.

0 голосов
/ 16 августа 2011

Вам нужно позвонить malloc, а не realloc на board. Когда вы создаете экземпляр объекта Board, для члена board не выделяется память; поэтому речь идет не о перераспределении памяти, а о выделении памяти board обычным способом для многомерных массивов .

#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
        }
    }

Однажды вы выделили память, а затем, если вам нужно расширить board (например, board изначально был 2x2, а теперь вы хотите, чтобы он был 6x6), вызовите realloc в том же порядке, который вы называли malloc для инициализации board.

0 голосов
/ 16 августа 2011

Если вам нужно больше строк, вы должны позвонить realloc на board, если вы хотите расширить строки, вам нужно вызвать realloc на каждой ранее выделенной линии (например, board[0], board[1] и т. Д.)

...