2009-11-07 166 views
0

所以我開始我的魔方HW,在那裏我要求用戶輸入一個奇數,並且它會創建一個魔術方塊。我必須使用指針和數組,因爲這是我迄今爲止所瞭解到的。不問如何做幻方,但什麼原因造成分段錯誤,即時通訊可能不是做指針二維數組正確分割錯誤,使用指針指針

#include <iostream> 
using namespace std; 

int main() 
{ 
int **ptr; 
int odd; 
do 
{ 
    cout << "Enter a odd number to create a magic square: "; 
    cin >> odd; 
}while(odd % 2 != 1); 

ptr = new int *[odd]; //creates a new array of pointers to int objects 
for(int i = 0; i < odd; i++) 
    ptr[i] = new int[odd]; 

//set it all to 0 
for(int i = 0; i < odd; i++) 
{ 
    for (int j = 0; j < odd; j++) 
    { 
     ptr[i][j] = 0; 
     cout << ptr[i][j]; 
    } 
} 
int row = odd; 
int column = odd/2; 
int lastrow = row; 
int lastcolumn = column; 

//begin adding numbers to magic square 
ptr[row][column] = 1; 
for (int i = 2; i < odd * odd; i++) 
{ 

} 

//delete 
for(int i = 0 ; i < odd; i++) 
    delete [] ptr[i]; 
delete [] ptr; 
return 0; 
} 

回答

4

int row=odd;應該int row=odd-1;
你跟排後的索引,所以你能數組[size_of_array],它總是出界。

+1

這可能是正確的,但因爲這個問題涉及到一門功課,我認爲它實際上是更有益告訴Raptrex如何找到比錯誤告訴他錯誤在哪裏...... – 2009-11-07 20:23:08

+0

謝謝,這樣做很有意義 – Raptrex 2009-11-07 20:24:56

1

的第一件事,當你得到一個分割故障做要麼搶調試並追蹤段錯誤發生的位置,或者(更簡單),在代碼中爲cerr添加大量打印輸出,以便在段錯誤之前可以看到有多少代碼被執行。

附加提示:使用cerr而不是cout,以避免緩衝,否則可能導致您無法看到錯誤發生前應獲得的某些輸出,並且始終爲每個打印輸出添加一個換行符,以避免在下一次提示時出現換行在運行程序的shell中。

0

此:

ptr[row][column] = 1; 

訪問陣列出界(提示:PTR [行]將有可能在大多數malloc實現NULL)。

1

gdb能夠準確地告訴你seg段發生的時間,並讓你從中打印數據。它可能是您找出段錯誤發生的最佳選擇。

與-g編譯程序(假設你使用GCC)