尝试这种情况:
#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;
}
需要第二环路分配在C和类似的操作2-d阵列释放它。二维数组本质上是一个数组数组,因此可以表示为一个指针数组。循环初始化指向指针的数组。
按照下面的@Eric Postpischil的对话进行澄清:更改createTable以获取真正动态分配的行/列数。
如果尺寸在编译时已知,则可以以这种方式为二维数组分配空间。也就是说,分配'new int [10] [10]'是正确的。 'table'的声明需要改变。如果数组是矩形的(没有不同长度的行),那么分配多个指针并使用指针指向是非常浪费的。分配仍然可以在一次调用中执行,并且可以使用助手类或其他结构支持多个维度。 – 2013-04-09 18:05:22
此外,创建指向指针的指针会在使用该表时导致多个指针查找,并且会干扰编译器优化代码。当有指向指针的指针时,编译器可能很难确定它们实际上是指向不同的东西,因此不能互相混淆。当表作为指向单个对象的指针传递时,编译器知道对不同索引的引用是内存中的不同位置。这允许可以缩短执行时间的代码重新排列。 – 2013-04-09 18:07:18