多维数组的运行时分配

Posted

技术标签:

【中文标题】多维数组的运行时分配【英文标题】:Runtime allocation of multidimensional array 【发布时间】:2011-03-23 13:09:42 【问题描述】:

到目前为止我认为下面的语法是无效的,

int B[ydim][xdim];

但是今天我试过了,它奏效了!我运行了很多次以确保它不会偶然运行,甚至 valgrind 也没有报告任何 segfault内存泄漏!我很惊讶。它是 g++ 中引入的新功能吗?我一直使用一维数组来存储矩阵,方法是使用正确的步长对矩阵进行索引,就像在下面的程序中使用 A 所做的那样。但是这个新方法,和 B 一样,简单优雅,是我一直想要的。使用起来真的安全吗?请参阅示例程序。

PS。我正在用 g++-4.4.3 编译它,如果这很重要的话。

#include <cstdlib>
#include <iostream>

int test(int ydim, int xdim) 
// Allocate 1D array
    int *A = new int[xdim*ydim](); // with C++ new operator
    // int *A = (int *) malloc(xdim*ydim * sizeof(int)); // or with C style malloc
    if (A == NULL)
        return EXIT_FAILURE;

// Declare a 2D array of variable size
    int B[ydim][xdim];

// populate matrices A and B
    for(int y = 0; y < ydim; y++) 
        for(int x = 0; x < xdim; x++) 
            A[y*xdim + x] = y*xdim + x;
            B[y][x] = y*xdim + x;
        
    

// read out matrix A
    for(int y = 0; y < ydim; y++) 
        for(int x = 0; x < xdim; x++)
            std::cout << A[y*xdim + x] << " ";
        std::cout << std::endl;
    
    std::cout << std::endl;

// read out matrix B
    for(int y = 0; y < ydim; y++) 
        for(int x = 0; x < xdim; x++)
            std::cout << B[y][x] << " ";
        std::cout << std::endl;
    

    delete []A;
    // free(A); // or in C style
    return EXIT_SUCCESS;



int main() 
    return test(5, 8);

【问题讨论】:

【参考方案1】:

这是一个 C99 的“可变长度数组”或 VLA。如果 g++ 也支持它们,那么我相信它是 C++ 标准的扩展。

很好,不是吗?

【讨论】:

变长数组不是标准的C++,所以它绝对是C++的扩展。 哦,是的!他们是一个真正的美女:)【参考方案2】:

int b[ydim][xdim] 在堆栈上声明一个二维数组。另一方面,new 在堆上分配数组

对于任何重要的数组大小,将它放在堆上几乎肯定会更好,以免您耗尽堆栈空间,或者如果您想将数组传回当前范围之外的东西。

【讨论】:

感谢您指出警告。还有更好的方法来为我不知道的多维数组分配内存吗?像 int *A = new int[xdim][ydim](); 这样好的东西这可能只是我的一厢情愿,但今天我完全发现了一个奇迹! 很遗憾,不——尽管您可以改用 STL,它为您提供像 vector 这样表现得更好的东西——即您可以分配 vector&lt;vector&lt;int&gt;&gt; b,然后以 b[x][y] 访问它。即使你在堆栈上分配了向量,它们内部通常使用堆内存(只有向量 object 存储在堆栈上,它保留了指向实际分配内存的指针)。

以上是关于多维数组的运行时分配的主要内容,如果未能解决你的问题,请参考以下文章

java中多维数组如何构造索引?

PHP高级教程-多维数组

Java浅谈数组之多维数组

Java基础 | 深入理解多维数组

连续数组多维表示的快速元素访问

表示为一维的多维数组(模板化为 n 维)