Меня интересуют различные способы выделения памяти в куче для двумерных массивов.Распределение памяти для указателя на массив и указатель на указатель
Похоже, что при доступе к указателям на указатели и указатели на массивы одного или нескольких измерений используется одно и то же обозначение. Я надеялся, что кто-то разъяснит разницу и полезность каждого из них. Они оба правы?
Это первый способ будет хранить массив как указатель на указатель:
char **createTable(int r, int c) {
char **table;
int i;
char *offset;
table = malloc(r * sizeof (char *) + r * c * sizeof (char));
if (!table) return NULL;
offset = (char *) table + sizeof (char *) * r;
for (i = 0; i < r; i++) {
table[i] = offset + c * i;
}
return table;
}
Этот другой путь кажется быстрее. Я не могу придумать хороший способ обернуть его в функцию, подобную другой.
char (*table)[c];
table = (char (*)[c]) calloc(r * c, sizeof (char));
Am I прямо в понимании того, что даже если массивы как статические указатели, массивы имеют возможность иметь несколько измерений сами по себе?
Верно ли, что первый способ, который я описываю, является православным способом?
Оба, кажется, делают то же самое. Второй, безусловно, более изящный. –
Почему не просто 'char table [r] [c]'? Думаю, ваше намерение состоит в том, что можно будет вернуть указатель из функции, которая его выделяет? Возможно, было бы полезно сделать это ясным в вопросе, чтобы мы знали, почему вы не просто выполняете 'char table [r] [c];' –
Чтобы быть более конкретным: вы не можете вернуть 'table', где' table 'is' char (* table) [c]; 'от функции, которая возвращает' char ** '.Clang: 'несовместимые типы указателей возвращают 'char (*) [c]' из функции с типом результата 'char **'' –