在 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的主要内容,如果未能解决你的问题,请参考以下文章

在c ++中找到二维数组中的最大区域

c语言中的0‘0’‘

c语言中的0‘0’‘

c语言中的0‘0’‘

为啥我们需要在 C 中的字符数组末尾添加一个'\0'(null)?

Identity 2.0.0 中的 ApplicationUser 和 ApplicationRole 导航属性