2016-11-27 76 views
-2

我正在做一個測試和在線測試引擎顯示分段錯誤,這是混亂,因爲沒有進一步的細節,我檢查指針沒有NULL,他們工作得很好,但不要如何陣列在這裏工作。因爲在調試時,一切都很好,直到我試圖打印出數組。它的報道是在這裏被粉碎並破碎。如果它破裂,我什麼都不能做,而我打破或繼續。如果我繼續,它運行得很好。所以我非常困惑。反轉動態分配數組的程序中的分段錯誤

我的電腦是windows 7,我在visual studio 2010 C++中運行代碼。 調試不是很清楚解決問題,而且我學習C++的效率不高。 用解決數組需要動態分配。

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 
void reverseArray(int size, int num[]) { 
    if(size>1) { 
     int *p = &num[size-1]; 
     int *f = num; 
     for(int i = 0;i < size/2; i++){ 
      swap(*p, *f); 
      p--; 
      f++; 
     } 
    } 
} 

int main() { 
    int len; 
    int a[len];/This is the bug, can't use uninitialized var assign array/ 
    cin >> len; 
    for(int i = 0; i < len; i++){ 
     cin >> a[i]; 
    } 
    reverseArray(len, a); 
    for(int i = 0; i < len; i++){ 
     cout << a[i] << " "; 
    } 
    return 0; 
} 

這有一些與動態分配,當我在java工作,我創建一個新的數組。 我不得不

int[] newArray = {2,4,1,2,3}; 

int[] newArray = new int[] {2,4,1,2,3}; 

最後,這個問題就解決了,這讓我很高興。 閱讀和學習非常重要,編碼也很重要。 謝謝大家,

並使用載體而不是使用數組。 這會更容易。

#include <cstdio> 
#include <vector> 
#include <iostream> 
using namespace std; 
int main() { 
    int a; 
    int len; 
    vector<int> myvector; 
    cin >> len; 
    for(int i = 0; i < len; i++){ 
     cin >> a; 
     myvector.push_back(a); 
    } 
    reverse(myvector.begin(), myvector.end()); 
    for(int i = 0; i < len; i++){ 
     cout << myvector[i] << " "; 
    } 
    return 0; 
} 

使用陣列再次(我懷疑下面的代碼):

#include<iostream> 
//#include<cstdlib> 
using namespace std; 

void reverseArray(int size, int nums[]){ 
    if(size > 1){ 
     int *p = &nums[size-1]; 
     int *q = nums; 
     for(int i = 0; i< size/2; i++){ 
      swap(*p, *q); 
      p--; 
      q++; 
     } 
    } 
} 

int main(){ 
    int len; 
    cin >> len; 
    int *a = new int[len];//a point to the first ele. 

    for(int i = 0; i< len; i++){ 
     cin >> a[i]; 
    } 
    reverseArray(len, a); 
    for(int i = 0; i < len; i++){ 
     cout << a[i] << " "; 
    } 
    delete [] a; 
    return 0; 

} 

它完美對我的筆記本電腦,這是令人困惑,因爲一個是指針,我卻用它像一個陣列。它不應該工作......

最終陣列版本: http://ideone.com/ZMsD35 完成完成。

#include<iostream> 
using namespace std; 

int main(){ 
    int len; 
    cin >> len; 
    int *a = new int[len]; 
    for(int i = 0; i< len; i++){ 
     cin >> a[i]; 
    } 
    reverse(a, a+len); 
    for(int i = 0; i< len; i++){ 
     cout << a[i]; 
    } 
    delete [] a; 
    system("pause"); 
    return 0; 

} 
+1

評論不適合廣泛的討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/129268/discussion-on-question-by-r-mia-segmentation-fault-in-a-program-that-reverses-一個)。 –

回答

0

段錯誤的最可能原因是輸入。當測試軟件通過大小足以溢出自動存儲​​區域len,你的程序崩潰在這條線:

int a[len]; 

len精確值取決於系統,但100萬的投入應做的最共同的系統。

解決方法是真的簡單 - 與

int a* = new int[len]; 

這取代聲明將放置數據的動態內存,而不是自動記憶。它還會使你的程序符合標準,因爲C++中的變長數組是標準的擴展。

不要忘記刪除a一旦你完成,以避免內存泄漏:

delete[] a; 
+0

嗨,非常感謝!它現在正在運行,我可以知道關鍵的兩行之間的區別嗎?我是否需要刪除每個指針? – flowera

+0

@ R.mia這會改變數據從自動內存(堆棧)到動態內存(堆)的位置。 – dasblinkenlight

+0

我可以知道什麼是相關文檔或鏈接,我可以參考/ – flowera