2013-04-09 173 views
2

我想使用从函数返回的二维int数组我应该如何定义函数返回值? 我用INT **但是编译器给了错误:从函数返回一个二维数组C++

int** tableCreator(){ 
    int** table=new int[10][10]; 
    for(int xxx=1;xxx<10;xxx++){ 
     for(int yyy=1;yyy<10;yyy++){ 
      table[xxx][yyy]=xxx*yyy; 
     } 
    } 
    return(table); //Here:cannot convert from 'int (*)[10]' to 'int **' 
} 

回答

4
int** table=new int[10][10]; 

这是错误的。您不能在C/C++中以这种方式为2D动态数组分配空间。

同时,你声明数组大小10,所以指数是从0-9,但是你想在你的嵌套赋值指数10 for循环,这是不对的了。

你可能做的分配如下:

int** table = new int*[10]; 
for (int i = 0; i < 10; ++i) 
{ 
    table[i] = new int[10]; 
} 
+1

如果尺寸在编译时已知,则可以以这种方式为二维数组分配空间。也就是说,分配'new int [10] [10]'是正确的。 'table'的声明需要改变。如果数组是矩形的(没有不同长度的行),那么分配多个指针并使用指针指向是非常浪费的。分配仍然可以在一次调用中执行,并且可以使用助手类或其他结构支持多个维度。 – 2013-04-09 18:05:22

+0

此外,创建指向指针的指针会在使用该表时导致多个指针查找,并且会干扰编译器优化代码。当有指向指针的指针时,编译器可能很难确定它们实际上是指向不同的东西,因此不能互相混淆。当表作为指向单个对象的指针传递时,编译器知道对不同索引的引用是内存中的不同位置。这允许可以缩短执行时间的代码重新排列。 – 2013-04-09 18:07:18

0

数组不是指针。

二,为什么不是vector<vector<int> >

三,如果不是,则:

typedef int Int10Array[10]; 
Int10Array *arr = new Int10Array[10]; 

四,为什么要写过去的界限?你想要明确的鼻子恶魔?

for(int xxx = 0; xxx < 10; xxx++) 
      ^^^  ^^^^ 
5

尝试这种情况:

#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以获取真正动态分配的行/列数。

+0

声明“您需要两个循环来分配C语言中的二维数组以及类似的操作来释放它”是错误的。具有固定大小的多维数组除了最外层维度外,很容易用一个'new'分配,并用一个'delete'重新分配,并且使用多个'new'和'delete'调用是浪费的。可变长度数组可以通过不需要多次分配和释放的各种方式来支持。 – 2013-04-09 17:57:26

+0

但这只有在您分配固定长度的行时才需要。例如X [10] [10]。如果你的行长度是可变的,一个真正的数组数组,你确实需要循环。 – mohaps 2013-04-09 17:58:51

+0

..并确实看看接受的答案:)它确实做循环。如果您要动态分配例如allocate2DArray(int i,int j)你必须循环不是吗? – mohaps 2013-04-09 18:01:32

1

通常,用于指向数组的类型是指向数组元素的指针。由于int的二维数组是int的数组的阵列,因此您需要一个指向int的数组的指针。这种类型的C++语法是int (*)[N],对于某些维度N。此代码演示:

#define N 10 

int (*tableCreator())[N] 
{ 
    int (*table)[N] = new int[N][N]; 

    for (int i = 0; i < N; ++i) 
     for (int j = 0; j < N; ++j) 
      table[i][j] = i*j; 

    return table; 
} 


#include <iostream> 


int main() 
{ 
    int (*t)[N] = tableCreator(); 

    for (int i = 0; i < N; ++i) 
    { 
     for (int j = 0; j < N; ++j) 
      std::cout << t[i][j] << ' '; 
     std::cout << '\n'; 
    } 

    delete [] t; 

    return 0; 
}