访问双指针会导致分段错误

时间:2011-09-16 11:06:07

标签: c++ pointers segmentation-fault

我正在为QM中的特征值问题编写Jacobis方法,我刚刚开始使用c ++,我想使用双指针来构造矩阵,但涉及的物理问题需要很多代码。

我不想让我的main()用不可读的行混乱(其他人必须阅读这段代码......),所以想把问题分成子函数。我创建了一个带双指针并返回矩阵的函数,但为什么我不能在函数外部访问它?我尝试时,我的代码 segfaults (标在下面)。如何在main()外部构建矩阵,同时仍能在main()中访问它?

enter code her    enter code here
int i, j, k;  


//== BEGIN MAIN ==//
int main ()
{
  //Constants and variables          
  double **A;
  double epsilon = pow((double)10, double(-8)); //The convergence limit for jacobis   method
  int N          = 10;                          //Dimension of matrix
  char test[] =  "test";
  cout <<"The inner matrix function:"<<endl;
  makematrix(N, A);
  cout<<endl<<"The outer matrix function:"<<endl;
  //This part segfaults
  for(i=0; i<N; i++)
  {
  cout<<endl;
  for(j=0; j<N; j++)
{
  cout<<A[i][j]<<" ";
}
 }
return 0;
 }
 //== END MAIN ==//



//==Begin function definitions==//
void makematrix(int N, double **A)
{
   //Function for initializing our tridiagonal matrices for jacobis method
    A = new double*[N];
for(i=0; i<N; i++)
{
  A[i] = new double[N];
}
 for(i=0; i<N; i++)
{
  for(j=0; j<N; j++)
{
  A[i][j] = 0;
   }
     }
    //Prints the matrix declared here
    for(i=0; i<N; i++)
     {
       cout<<endl;
       for(j=0; j<N; j++)
    {
      cout<<A[i][j]<<" ";
    }
    }
 cout <<endl;
 return;
}

5 个答案:

答案 0 :(得分:3)

归还:

double** makematrix(int N) {
    double **A = new double*[N];
    ...
    return A;
}

主要......

double **A = makematrix(N);

答案 1 :(得分:2)

//This part segfaults
  for(i=0; i<N; i++)

因为,您通过值(double **A内部已修改)而不是引用传递makematrix。将您的功能签名更改为以下内容,它应该可以工作:

void makematrix(int N, double **&A)
...                            ^^^ pass by reference

答案 2 :(得分:1)

因为当您将A传递给函数时,该函数将在A副本上运行。它将该副本设置为指向new数组,但这不会影响原始A

一个解决方案是:

double **A;

makematrix(N, &A);  // Pass address of A

...

void makematrix(int N, double ***A)
{
    (*A) = new double*[N];
    // etc.
}

即。传递A的地址,以便该函数可以修改原文。

注意:每当你最终需要三指针时,你可能会遇到设计问题。特别是在C ++中。

答案 3 :(得分:0)

我假设您应该通过引用将指针作为参数传递。 所以函数应该是这样的(我添加了一个&amp;):

void makematrix(int N, double **&A)

这样你的变量就会被改变,所以A现在是一个输出参数。

答案 4 :(得分:0)

要快速修复代码,请使用pass-by-reference解决方案,它比三重指针更容易阅读。

但是,如果你想在真正的C ++中编码,而不是在伪装的C中编码,那么隐藏矩阵后面的双数组复杂性的解决方案就是创建一个类。 C ++ FAQ Lite对您的问题进行了广泛的描述,并提供了解决问题的不同方法。见http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.11