2014-05-20 72 views
-4

我編寫了以下代碼作爲學校作業的一部分。它根據排序對學生的ID,它是100和999之間。但由於某些原因,我得到以下錯誤上的getId功能VS12調試時的私人int對象的指針數組:task2.exe中0x001066F6處未處理的異常:0xC0000005:訪問衝突讀取位置0x0000000C

Unhandled exception at 0x001066F6 in task2.exe: 
0xC0000005: Access violation reading location 0x0000000C. 

這在使用的getId代碼:

if (nr_of_students > 1) { 
    int pre = nr_of_students - 1; 
    int current = nr_of_students; 
    Student* temp; 
    // This pause will run: 
    system("pause"); 
    while (pre > 0 && students[pre]->getId() > students[current]->getId()) { 
     // This pause will NOT run: 
     system("pause"); 
     temp = students[current]; 
     students[current] = students[pre]; 
     students[pre] = temp; 
     pre--; 
     current--; 
    } 
} 

爲學生類的代碼:

class Student : public Person { 
private: 
    int id; 
    /* Other variables */ 
public: 

    /* Constructors and functions */ 

    int getId() { 
     return id; 
    } 
}; 

這到底是怎麼回事?

+1

_''Hhat hell going?'_很可能你是解除引用無效('NULL')指針。 –

+2

也許內置的調試器可能有一些幫助?就像也許告訴你哪一行產生錯誤? –

+0

我只在使用調試器時出現錯誤,否則它只會崩潰。調試器說錯誤在它從getId函數返回id的行上。 – jyggorath

回答

1

基於所提供的信息最可能的原因:

current等於nr_of_students,並在

while (pre > 0 && students[pre]->getId() > students[current]->getId()) 

current用作數組索引。由於數組索引從zero開始,如果nr_of_students實際上等於數組中的的數量,則這會是個問題。例如。如果有5元素,則最大索引可以是4,而不是5。如果使用5,則內存位置無效,將返回無效的Student*,並調用getId(),該無效指針將導致訪問衝突錯誤

相關問題