Выделение памяти в 2D массив в C - PullRequest
0 голосов
/ 07 ноября 2018

Почему я не могу выделить каждый индекс двумерного массива индивидуально. Есть ли правильный и правильный способ выделения памяти, если вы хотите использовать динамически распределенный массив в C? Я получаю ошибку сегментации для этого кода вот мой код:

 typedef struct
 {
    char ***sheet;
    int columns;
    int rows;
 } SPREADSHEET;  // to access data sheet[COL][ROW]



 SPREADSHEET *createSpreadSheet(int columns, int rows) {
    if (columns <= 0 || rows <= 0){  // Disallow 0 or negative rows/columns
        return NULL;
    }
    SPREADSHEET *sp = malloc(sizeof(SPREADSHEET));
    sp->columns = columns;
    sp->rows = rows;



    for(int i=0; i<rows; i++){
        for(int j=0; j<columns; j++){
            printf("i: %i, j: %i\n", i, j);
            sp->sheet[i][j] = malloc(sizeof(char(*))+2);
        }
    }
    return sp;
 }

1 Ответ

0 голосов
/ 07 ноября 2018

Я думаю, что вы ищете это:

typedef struct
{
  int columns;
  int rows;
  char sheet[];
} SPREADSHEET;

SPREADSHEET *sp = malloc( sizeof(SPREADSHEET) + sizeof(char[columns][rows]) );
sp->columns = columns;
sp->rows = rows;

for(size_t i=0; i<columns; i++)
{
  for(size_t j=0; j<rows; j++)
  {
    sp->sheet[i*rows + j] = something;
  }
}

...
free(sp);

Где sheet - это так называемый гибкий элемент массива . Он должен быть объявлен последним в структуре, и он гарантированно будет вести себя детерминистически, когда вы выделяете конечную память после самой структуры. Переменная сама по себе не увеличивает размер структуры.

К сожалению, C допускает только однорядные элементы гибкого массива, поэтому вы должны использовать «искаженный 2D-массив», если хотите использовать его, как в вашем случае. Это означает, что мы вычисляем индекс массива вручную во время выполнения, чтобы получить доступ к элементам массива.

В качестве альтернативы, вы можете получить доступ к элементам через указатель временного массива, который также четко определен:

char (*arr)[rows] = (void*) sp->sheet;
for(size_t i=0; i<columns; i++)
{
  for(size_t j=0; j<rows; j++)
  {
    arr[i][j] = something;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...