创建一个具有可变尺寸维度的二维数组。

9

我想要能够根据从文件中读取的宽度和高度创建一个二维数组,但是当我使用以下代码时出现错误:

int array[0][0]
array = new int[width][height]

请参见https://dev59.com/k1XTa4cB1Zd3GeqPyyQ5。 - Zan Lynx
使用 std::vector - Jesper Juhl
3个回答

22

你应该使用指向指针的指针:

int** array;
array = new int*[width];
for (int i = 0;i<width;i++)
    array[i] = new int[height];

当你使用完它或者想要调整大小时,应该像这样释放已分配的内存:

for (int i = 0;i<width;i++)
    delete[] array[i];
delete[] array;

为了理解并能够阅读更复杂的类型,这个链接可能会有用:

http://www.unixwiz.net/techtips/reading-cdecl.html

希望这对你有帮助。


2
记得使用 delete[] 来删除。 - sje397
TAMER,我认为你需要交换高度和宽度。 - jonsca

1

尝试这种方式:

  int **array; // array is a pointer-to-pointer-to-int

    array = malloc(height * sizeof(int *));
    if(array == NULL)
        {
        fprintf(stderr, "out of memory\n");
        exit or return
        }
    for(i = 0; i < height ; i++)
        {
        array[i] = malloc(width * sizeof(int));
        if(array[i] == NULL)
            {
            fprintf(stderr, "out of memory\n");
            exit or return
            }
        }

    array = new int*[width];
    if(array == NULL)
        {
        fprintf(stderr, "out of memory\n");
        exit or return
         }
    else
    {
    for (int i = 0;i<width;i++)
        array[i] = new int[height];
    }

1
在C++中应该避免使用malloc - sje397
1
这是一种非常 C 式的做法。此外,fprintf 调用在这里真的没有什么用处。它需要进行一些清理。 - Jon

1

如果数组是矩形的,就像你的例子一样,你只需要进行一次分配即可:

int* array = new int[width * height];

这将数组有效地转换为单维数组,且速度更快。

当然,既然是 C++,为什么不使用 std::vector<std::vector<int> > 呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接