Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;尝试写入矩阵后出现分段错误_C++_Dynamic Memory Allocation - Fatal编程技术网

C++ C++;尝试写入矩阵后出现分段错误

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

我把这个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;
    }
}
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)]