Попробуйте это:
#include <cstdio>
#include <cstdlib>
int** createTable(int rows, int columns){
int** table = new int*[rows];
for(int i = 0; i < rows; i++) {
table[i] = new int[columns];
for(int j = 0; j < columns; j++){ table[i][j] = (i+j); }// sample set value;
}
return table;
}
void freeTable(int** table, int rows){
if(table){
for(int i = 0; i < rows; i++){ if(table[i]){ delete[] table[i]; } }
delete[] table;
}
}
void printTable(int** table, int rows, int columns){
for(int i = 0; i < rows; i++){
for(int j = 0; j < columns; j++){
printf("(%d,%d) -> %d\n", i, j, table[i][j]);
}
}
}
int main(int argc, char** argv){
int** table = createTable(10, 10);
printTable(table, 10, 10);
freeTable(table, 10);
return 0;
}
Вам нужен второй цикл выделить 2-D массив в C и подобной операции, чтобы освободить ее. двухмерный массив по существу представляет собой массив массивов, поэтому его можно выразить как массив указателей. цикл инициализирует массивы, указывающие на указатели.
Уточнение в соответствии с беседой с @Eric Postpischil ниже: изменилось createTable, чтобы подсчитать количество строк/столбцов для действительно динамического распределения.
Если размеры известны во время компиляции, вы можете выделить пространство для двумерного массива таким образом. То есть, распределение 'new int [10] [10]' является правильным. Объявление таблицы должно быть изменено. Если массив прямоугольный (не имеет строк разной длины), то выделение нескольких указателей и использование указателей для указателей является расточительным. Выделение по-прежнему может выполняться одним вызовом, а несколько измерений могут поддерживаться с помощью вспомогательного класса или других конструкций. –
Кроме того, создание указателей на указатели вызывает поиск нескольких указателей всякий раз, когда используется таблица, и это мешает компилятору оптимизировать код. Когда есть указатели на указатели, компилятору может быть сложно определить, что они на самом деле указывают на разные вещи и поэтому не могут друг друга. Когда таблица передается как указатель на один объект, компилятор знает, что ссылки на разные индексы - это разные места в памяти. Это позволяет переупорядочить код, что может улучшить время выполнения. –