c++ - 使用一个动态分配的内存块创建 2d 或 3d 数组

标签 c++ matrix multidimensional-array dynamic-memory-allocation

我有一个二维数组,我使用 new 动态分配了它。

问题是我想将内存分配为一个连接的 block ,而不是分开的 block ,以提高处理速度。

有谁知道是否可以使用 new 来做到这一点,或者我是否必须使用 malloc?

这是我的代码:

A = new double*[m];
    for (int i=0;i<m;i++)
    {
        A[i]= new double[n];
    }

此代码会导致段错误

phi = new double**[xlength];
phi[0] = new double*[xlength*ylength];
phi[0][0] = new double[xlength*ylength*tlength];
for (int i=0;i<xlength;i++)
{
    for (int j=0;j<ylength;j++)
    {
        phi[i][j] = phi[0][0] + (ylength*i+j)*tlength;
    }
    phi[i] = phi[0] + ylength*i;
}

最佳答案

您可以分配一大块并适本地使用它,如下所示:

double* A = new double[m*n];
for (int i=0; i<m; i++) {
    for (int j=0; j<n; j++) {
        A[i*n+j] = <my_value>;
    }
}

您可以使用malloc代替使用new - 没有太大区别,除了new必须与一起释放删除,并使用free()释放malloc()

更新1: 您可以创建“真正的”二维数组(尺寸为 m x n):

double** A = new double*[m];
double*  B = new double[m*n];
for (int i=0; i<m; i++) {
    A[i] = B + n*i;
    for (int j=0; j<n; j++) {
        A[i][j] = <my_value>;
    }
}

请确保最后同时释放 AB

更新2:

根据大众的要求,这就是如何创建“真正的”3维数组(尺寸为m x n x o) :

double*** A = new double**[m];
double**  B = new double*[m*n];
double*   C = new double[m*n*o];
for (int i=0; i<m; i++) {
    A[i] = B + n*i;
    for (int j=0; j<n; j++) {
        B[n*i+j] = C + (n*i+j)*o;
        for (int k=0; k<o; k++) {
            A[i][j][k] = <my_value>;
        }
    }
}

这使用了 2 个相对较小的“索引”数组 AB,以及数据数组 C。像往常一样,这三个都应该在使用后释放。

将其扩展到更多维度留作读者的练习。

关于c++ - 使用一个动态分配的内存块创建 2d 或 3d 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16555862/

相关文章:

r - 有没有办法在修改属性时防止修改时复制?

SSRS 中每一页的矩阵总数

python - Numpy reshape "reversal"

c++ - 通过对循环函数的引用传递变量

c++ - 程序入口点 __gxx_personality_sj0 无法位于...

database - R - 将矩阵中的每个值除以其行/列的最大值

墙内的Java迷宫并获得所有可能的路径

java - 将多维数组中的文本替换为 Java 中另一个多维数组中的另一个文本

C++ MySQL驱动->连接VS2013

C++:奇怪的 vector 行为