【问题标题】:C++ Segmentation Fault After When Trying to Write to Matrix尝试写入矩阵后的 C++ 分段错误
【发布时间】:2013-05-09 13:17:04
【问题描述】:

我将这个 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;
}

【问题讨论】:

  • 请使用c++ containers
  • 第二个代码工作不正确,它是undefined behavior,只是一些尚未崩溃的内存泄漏(但以后可能会崩溃)。使用内存泄漏检测器,例如valgrind
  • 是的,毕竟没用。该实现似乎不适用于 3 个维度。
  • 程序没有崩溃并不意味着它可以工作;和未定义的行为有时甚至可能表现为明显有效(但会与其他系统、场景等崩溃)

标签: c++ dynamic-memory-allocation


【解决方案1】:

您没有分配其他子矩阵,例如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这样的内存泄漏检测器

【讨论】:

  • 我的 for 循环目前不这样做吗?
  • 不,你只是分配phi[0]而不是phi[1]
  • 哦,是的,我有那个实现,但这并没有将所有内存初始化为一大块。相反,我得到了参差不齐的数组...
  • 除了 2D 之外,这个问题的答案是一样的。 stackoverflow.com/questions/16555862/…
  • 感谢定义的符号。如果没有别的办法,那就行了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多