从c ++中的函数返回二维数组

MrH*_*rHs 2 c++ arrays return-type

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

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 **'
}
Run Code Online (Sandbox Code Playgroud)

moh*_*aps 6

试试这个:

#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;
}
Run Code Online (Sandbox Code Playgroud)

您需要第二个循环在C中分配一个二维数组,并采用类似的操作来释放它.二维数组本质上是一个数组数组,因此可以表示为指针数组.循环初始化指向指针的数组.

根据与@Eric Postpischil的对话进行澄清:更改了createTable以获取真正动态分配的行/列数.


tao*_*ocp 5

int** table=new int[10][10];
Run Code Online (Sandbox Code Playgroud)

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

同时,您将数组大小声明为10,因此索引来自0-9,但是您试图10在嵌套的 for 循环中为索引分配值,这也是不对的。

您可以执行以下操作进行分配:

int** table = new int*[10];
for (int i = 0; i < 10; ++i)
{
   table[i] = new int[10];
}
Run Code Online (Sandbox Code Playgroud)

  • 如果在编译时已知维度,则可以通过这种方式为二维数组分配空间。也就是说,分配`new int[10][10]`是正确的。`table` 的声明需要更改。如果数组是矩形的(没有不同长度的行),那么分配多个指针并使用指向指针的指针是一种浪费。分配仍然可以在单个调用中执行,并且可以通过辅助类或其他结构来支持多个维度。 (2认同)