我将这个3D矩阵分配为一个内存块,但是当我尝试写入该内容时,它会给我一个分段错误。这个东西适用于两个维度,但由于某种原因,我遇到第三个问题......我不知道错误在分配中的位置。它看起来很完美。
以下是代码:
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++)
{
phi[i] = phi[0] + ylength*i;
for (int j=0;j<ylength;j++)
{
phi[i][j] = phi[i][0] + tlength*j;
}
}
非常感谢任何帮助。 (是的,我想要一个3D矩阵)
此外,如果重要的话,这就是我遇到分段错误的地方:
for (int i = 0; i < xlength; i++)
{
for (int j = 0; j < ylength; j++)
{
phi[i][j][1] = 0.1*(4.0*i*h-i*i*h*h)
*(2.0*j*h-j*j*h*h);
}
}
这确实适用于两个维度!
phi = new double*[xlength];
phi[0] = new double[xlength*ylength];
for (int i=0;i<xlength;i++)
{
phi[i] = phi[0] + ylength*i;
}
答案 0 :(得分:0)
您没有分配其他子矩阵,例如phi[1]
或phi[0][1]
至少需要
phi = new double**[xlength];
for (int i=0; i<xlength; i++) {
phi[i] = new double* [ylength];
for (int j=0; j<ylength; j++) {
phi[i][j] = new double [zlength];
for (k=0; k<zlength; k++) phi[i][j][k] = 0.0;
}
}
你应该考虑使用std::vector(甚至,如果在C ++ 2011中,std::array),即
std::vector<std::vector<double> > phi;
然后使用std::vector
,您需要phi.resize(xlength)
并循环调整每个子元素phi[i].resize(ylength)
等。
如果你想一次分配所有内存,你可以
double* phi = new double[xlength*ylength*zlength]
但是你不能使用phi[i][j][k]
表示法,所以你应该
#define inphi(I,J,K) phi[(I)*xlength*ylength+(J)*xlength+(K)]
并写下inphi(i,j,k)
而不是phi[i][j][k]
你的第二个代码不起作用:它是undefined behavior(它不会崩溃,因为你很幸运,它可能会在其他系统上崩溃......),只是一些内存泄漏但还没有崩溃(但可能会在以后崩溃,甚至可能再次重新运行程序)。使用像valgrind
这样的内存泄漏检测器