C++ C++;尝试写入矩阵后出现分段错误
我把这个3D矩阵分配为一块内存,但当我试图写入这个该死的东西时,它给了我一个分割错误。这个东西在两个维度上都很好,但由于某种原因,我在第三个维度上遇到了问题……我不知道分配中的错误在哪里。我觉得它很完美 代码如下:C++ C++;尝试写入矩阵后出现分段错误,c++,dynamic-memory-allocation,C++,Dynamic Memory Allocation,我把这个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
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;
}
}
phi=新的双**[xlength];
φ[0]=新的双*[xlength*ylength];
φ[0][0]=新的双波长[xlength*ylength*tlength];
对于(int i=0;i您没有分配其他子矩阵,例如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;
}
}
但是您不能使用phi[i][j][k]
符号,因此您应该
#define inphi(I,J,K) phi[(I)*xlength*ylength+(J)*xlength+(K)]
并编写inphi(i,j,k)
而不是phi[i][j][k]
您的第二个代码不起作用:它是(它不会崩溃,因为您很幸运,它可能会在其他系统上崩溃……),只是一些内存泄漏,它还没有崩溃(但可能会在以后崩溃,甚至可能再次运行程序).使用内存泄漏检测器,如请参阅:请使用c++容器
第二个代码工作不正常,只是一些内存泄漏,尚未崩溃(但可能稍后崩溃).使用内存泄漏检测器,比如Yeah,它毕竟不起作用。该实现在3维环境下似乎不起作用。程序不崩溃的事实并不意味着它可以工作;未定义的行为有时甚至可能表现为明显工作(但会与其他系统、Scenari等一起崩溃)我的for循环目前不是在这样做吗?不,您只是在分配phi[0]
而不是phi[1]
etcOh,是的,我有那个实现,但它并没有将所有内存初始化为一个大的块。相反,我得到了锯齿状数组…这个数组的答案除了2D之外,做了同样的事情。不过感谢定义的符号。如果没有其他方法,它也可以工作。
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<std::vector<double> > phi;
double* phi = new double[xlength*ylength*zlength]
#define inphi(I,J,K) phi[(I)*xlength*ylength+(J)*xlength+(K)]