簡體   English   中英

訪問雙指針會導致分段錯誤

[英]Accessing double pointer causes segmentation fault

我正在為QM中的特征值問題編寫Jacobis方法,而我剛開始使用c ++,我想使用雙指針構造矩陣,但是涉及的物理問題需要大量代碼。

我不想用不可讀的行使我的main()混亂(其他人將不得不閱讀此代碼..),因此想將問題分為子函數。 我做了一個帶有雙指針並返回矩陣的函數,但是為什么不能在函數外部訪問它呢? 我的代碼段錯誤 (下標),當我嘗試。 我如何在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;
}

把它返還:

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

在主要...

double **A = makematrix(N);
//This part segfaults
  for(i=0; i<N; i++)

因為,您傳遞double **A是值double **Adouble **A (在makematrix修改),而不是引用。 將您的函數簽名更改為以下,它應該可以工作:

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

因為當您將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 ++中。

我假設您應該通過引用將指針作為參數傳遞。 因此該函數應如下所示(我添加了&):

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

這樣,您的變量將被更改,因此A現在是輸出參數。

要快速修復代碼,請使用按引用傳遞解決方案,它比三重指針更易於閱讀。

但是,如果要使用真實的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM