Как перераспределить указатель на 2d-структуру с разным размером

Я хочу перераспределить массив 2d указателей. Он должен быть динамическим следующим ascii

+=====+==============+==============+==============+==============+======+
|     | [0]          | [1]          | [2]          | [3]          | [..] |
+=====+==============+==============+==============+==============+======+
| [0] | 'a'          | 'b'          | 'c'          | 'd'          |      |
+-----+--------------+--------------+--------------+--------------+------+
| [1] | object[0][0] | object[1][0] | object[2][0] | object[3][0] |      |
+-----+--------------+--------------+--------------+--------------+------+
| [2] | object[0][1] | object[1][1] | object[2][1] | object[3][1] |      |
+-----+--------------+--------------+--------------+--------------+------+
| [3] | object[0][2] | object[1][2] | object[2][2] |              |      |
+-----+--------------+--------------+--------------+--------------+------+
| [4] | object[0][3] |              | object[2][3] |              |      |
+-----+--------------+--------------+--------------+--------------+------+
| [5] | object[0][4] |              |              |              |      |
+-----+--------------+--------------+--------------+--------------+------+
| [6] | object[0][5] |              |              |              |      |
+-----+--------------+--------------+--------------+--------------+------+

В этой таблице размер каждого столбца отличается. Как я могу сделать это с 2d структурой. Я выделил матрицу с помощью malloc. Но я хочу перераспределить второй индекс. Как эта матрица[25][n]. N должно быть перераспределено для каждого столбца с разным размером. Но это должно быть во время выполнения

Код :

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    char word[20];
}Dictionary;

Dictionary **object;
void initializeDictionary()
{
     // Create matrix [29][1]
     object=(Dictionary**)malloc(29 * sizeof(Dictionary*));
     object[0]=(Dictionary*)malloc(1*sizeof(Dictionary));
}

person qwerty    schedule 14.04.2019    source источник
comment
Почему индекс строки 4 имеет пробел в индексе столбца 1? Означает ли это, что указатель там нулевой?   -  person Jonathan Leffler    schedule 14.04.2019
comment
@JonathanLeffler: OP рассматривает данные для каждого столбца, так что первый индекс выбирает столбец.   -  person Jack    schedule 14.04.2019
comment
@Jack: Да, я только что понял, что OP не использует обычную нотацию array[row][col], а использует array[col][row], что гарантированно сбивает с толку - по крайней мере, меня и, вполне возможно, их, и, возможно, других полувнимательных читателей на SO .   -  person Jonathan Leffler    schedule 14.04.2019
comment
да то же самое, что вы сказали @JonathanLeffler.   -  person qwerty    schedule 14.04.2019


Ответы (1)


С указателями это происходит естественным образом. В вашем коде у вас есть Dictionary**, который действительно является указателем на указатель на словарь. Но вы можете видеть массив из Dictionary*, в котором каждый указатель указывает на массив из Dictionary объектов разного размера.

Dictionary** objects;
const int COLUMNS = 29;

objects = malloc(COLUMNS * sizeof(Dictionary*));

objects[0] = malloc(2 * sizeof(Dictionary)); // first column 2 elements
objects[1] = malloc(3 * sizeof(Dictionary)); // second column 3 elements

// ...

for (int i = 0; i < COLUMNS; ++i)
  free(objects[i]);

free(objects);
person Jack    schedule 14.04.2019
comment
Я скомпилировал ваш код. Когда я пробую этот код: objects[0] = malloc(2 * sizeof(Dictionary)); ..// Я могу получить доступ и назначить *(objects[0][100]).word . не должно быть максимум 2? почему я могу получить доступ к 100? - person qwerty; 14.04.2019
comment
Поскольку вы обязаны избегать неопределенного поведения, сам язык не мешает вам делать неправильные вещи. Вы не обращаетесь к действительной памяти. - person Jack; 14.04.2019
comment
Мне нужно увеличить размер без удаления данных во время выполнения - person qwerty; 14.04.2019
comment
затем либо вы malloc используете другой массив, memcpy элементы и заменяете указатель, либо используете realloc, который уже делает это за вас. - person Jack; 14.04.2019
comment
Это именно то, что я хочу. Как использовать realloc для индекса m, например [k] [m] - person qwerty; 14.04.2019
comment
Документация существует для вашего личного использования: en.cppreference.com/w/c/memory/realloc - person Jack; 14.04.2019