我有一个二维数组,我使用 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>;
}
}
请确保最后同时释放 A
和 B
。
更新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 个相对较小的“索引”数组 A
和 B
,以及数据数组 C
。像往常一样,这三个都应该在使用后释放。
将其扩展到更多维度留作读者的练习。
关于c++ - 使用一个动态分配的内存块创建 2d 或 3d 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16555862/