在 CandidateVotes.exe 中的 0x50E6F1C0 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000000
Posted
技术标签:
【中文标题】在 CandidateVotes.exe 中的 0x50E6F1C0 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000000【英文标题】:Exception thrown at 0x50E6F1C0 (ucrtbased.dll) in CandidateVotes.exe: 0xC0000005: Access violation reading location 0x00000000 【发布时间】:2017-10-04 14:39:20 【问题描述】:当我尝试运行我的程序时收到此通知。
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");
【问题讨论】:
string name[5] = 0 ;
-> string name[5];
【参考方案1】:
问题出现在这里:
string name[5] = 0 ;
这试图构造一个包含 5 个std::string
对象的数组,第一个字符串用0
初始化。
碰巧,这会调用以下构造函数:
basic_string(const char * const _Ptr)
然后,一旦取消引用空指针,就会报告访问冲突错误。
将空的char*
指针传递给std::string
构造函数是未定义的行为。
不需要为数组提供初始化器,因为std::string
默认构造器会正确初始化每个元素:
string name[5];
如果您想表明已考虑初始化,则可以使用以下语法:
string name[5] = ;
或
string name[5];
最后,启用尽可能多的合理警告总是一个好主意。在带有Level4 (/W4)
的 MSVC 上,我收到以下警告:
警告 C6387:'Param(1)' 可能是 '0':这不符合函数 'std::basic_string
的规范,std::allocator >::ctor'。
注意这一点可以避免以后出现一些混乱。
【讨论】:
【参考方案2】:您正在尝试使用 null 构造 std::string
。从name
的初始化列表中删除 0 或完全删除初始化列表。
string name[5];
【讨论】:
您可以将
全部删除。以上是关于在 CandidateVotes.exe 中的 0x50E6F1C0 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000000的主要内容,如果未能解决你的问题,请参考以下文章