[英]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 **A
的double **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.10和http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq -13.11
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.