2014-03-13 208 views
0

我試圖安排一個隨機數組。在代碼中,它只是按大小交換位置的第一步。 運行代碼時得到Debug Error,交換後的輸出顯示數組中的第一個數字已被刪除,最後一個數字是內存中的一個長隨機數。 它看起來像從i = 1開始交換,爲什麼?按升序排列數組

#include <iostream> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

void buildArray(int arr[], int size) { 
    srand ((unsigned int)time(NULL)); 
    for(int i = 0; i < size; ++i) 
     arr[i] = rand() % 50 + 0; 
} 


void dispArray(int arr[], int size) { 
    for(int i = 0; i < size; ++i) 
     cout << i << ": " << arr[i] << endl; 
} 


int main() 
{ 
     const int size = 5; 
    int  arr[size]; 
    buildArray(arr, size); 
    dispArray(arr, size); 

    int swapHolder = -1; 
    for(int i = 0; i < size; ++i) { 
    if(arr[i] > arr[i+1]) { 
      swapHolder = arr[i+1]; 
      arr[i+1] = arr[i]; 
      arr[i] = swapHolder; 
      cout << endl; 
     } 
    } 
    dispArray(arr, size); 

    return 0; 
} 


Output example: 
0: 46 
1: 15 
2: 47 
3: 5 
4: 19 


0: 15 
1: 46 
2: 5 
3: 19 
4: -858993460 

回答

2

這裏的問題是:if(arr[i] > arr[i+1]),你的環從[0, size - 1],所以在最後一次迭代,可以說size = 5,您將得到測試if(arr[5] > arr[6]),訪問未初始化的arr[6],正確的做法是讓你的循環從[0, size - 2]去:

for(int i = 0; i < size - 1; ++i) ... 
1
for(int i = 0; i < size; ++i) { 
    if(arr[i] > arr[i+1]) { 
      swapHolder = arr[i+1]; 
      arr[i+1] = arr[i]; 

最後的迭代是I = -1大小。然後

if(arr[i] > arr[i+1]) 

表示訪問數組超出範圍。這是未定義的行爲。