到目前为止,我认为以下语法无效,
int B[ydim][xdim];
但是今天我尝试了它的确有效!我运行了很多次以确保它不会偶然发挥作用,即使valgrind也没有报告任何段错误或内存泄漏 !!我很惊讶。它是g ++中引入的新功能吗?我总是使用1D数组来存储矩阵,方法是使用正确的步幅对它们进行索引,如下面的程序中的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);
}
答案 0 :(得分:1)
这是C99'可变长度数组'或VLA。如果它们也受到g ++的支持,那么我相信它是C ++标准的扩展。
很好,不是吗?
答案 1 :(得分:1)
int b[ydim][xdim]
在堆栈上声明了一个二维数组 。另一方面,new
在堆上分配数组。
对于任何非平凡的数组大小,将它放在堆上几乎肯定更好,以免你自己跑出堆栈空间,或者如果你想将数组传递回当前范围之外的东西。