代码之家  ›  专栏  ›  技术社区  ›  Aamir

多维数组的运行时分配

  •  0
  • Aamir  · 技术社区  · 16 年前

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

    int B[ydim][xdim];
    

    但今天我试过了,结果成功了!我试了很多次,以确保它不是偶然发生的,即使是Valgrind也没有报告任何 分段故障 内存泄漏 !!我很惊讶。这是G++中引入的新功能吗?我一直使用1d数组来存储矩阵,方法是用正确的步幅对它们进行索引,就像在下面的程序中使用a一样。但是这个新方法,和B一样,是如此简单和优雅,我一直想要。使用它真的安全吗?参见示例程序。

    另外,我正在用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);
    }
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Amber    16 年前

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

    对于任何非平凡的数组大小,最好将其放在堆中,以免耗尽堆栈空间,或者希望将数组传递回当前范围之外的某个对象。

        2
  •  1
  •   Jonathan Leffler    16 年前

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

    很好,不是吗?