多维数组的运行时分配
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<vector<int>> b
,然后以 b[x][y]
访问它。即使你在堆栈上分配了向量,它们内部通常使用堆内存(只有向量 object 存储在堆栈上,它保留了指向实际分配内存的指针)。以上是关于多维数组的运行时分配的主要内容,如果未能解决你的问题,请参考以下文章