2017-10-04 129 views
2

我試圖運行我的程序時收到此通知。在CandidateVotes.exe中引發0x50E6F1C0(ucrtbased.dll)異常:0xC0000005:訪問衝突讀取位置0x00000000

在CandidateVotes.exe中0x50E6F1C0(ucrtbased.dll)引發異常:0xC0000005:訪問衝突讀取位置0x00000000。

這裏是我的代碼:

編寫一個程序,允許用戶輸入的地方選舉五名候選人 以及每個候選人獲得的選票數的姓氏。 然後程序應該輸出每個候選人的姓名,收到的票數, 以及候選人收到的總票數的百分比。 你的程序也應該輸出選舉的獲勝者。

void main() 

{ 
    string name[5] = { 0 }; 
    int votes[5] = { 0 }; 
    int total = 0; 

    for (int i = 0; i < 5; i++) 
    { 
     cout << "What is the name of Candidate number " << i + 1 << "?" << endl; 
     cin >> name[i]; 

     cout << "How many votes did " << name[i] << " receive?" << endl; 
     cin >> votes[i]; 

     total += votes[i]; 

     cout << total << endl; 
    } 

    system("pause"); 

} 
+0

'字符串名稱[5] = {0};' - >'字符串名稱[5];' –

回答

1

您正試圖使用​​null構造std::string。從name的初始化列表中刪除0或完全刪除初始化列表。

string name[5]; 
+0

可以丟棄'{}'產品總數。 –

+0

@MichaelWalz真 - 編輯。 – Mark

3

的問題時的位置:

string name[5] = { 0 }; 

這試圖構建5個std::string對象的數組,與0初始化的第一字符串。

因爲它發生,這就要求下面的構造:

basic_string(const char * const _Ptr) 

然後,只要空指針被廢棄,被報道的訪問衝突錯誤。

傳遞null char*指針指向std::string構造函數是未定義的行爲


沒有必要提供了數組的初始化,爲std::string默認構造函數正確初始化每個元素:如果你想表明初始化被認爲那麼下面

string name[5]; 

語法將是確定的:

string name[5] = {}; 

string name[5]{}; 

最後,啓用盡可能多的合理警告總是一個好主意。在MSVC與Level4 (/W4),我得到以下警告:

警告C6387: '帕拉姆(1)' 可能是 '0':這不符合規範的功能「的std :: basic_string的< char,std :: char_traits < char>,std :: allocator < char>> :: {ctor}'。

注意到這可避免日後一些混亂。

相關問題