CandidateVotes.exe中0x50E6F1C0(ucrtbased.dll)抛出异常:0xC0000005:访问冲突读取位置0x00000000

时间:2017-10-04 14:39:20

标签: c++

我尝试运行程序时收到此通知。

CandidateVotes.exe中的0x50E6F1C0(ucrtbased.dll)抛出异常:0xC0000005:访问冲突读取位置0x00000000。

这是我的代码:

编写一个程序,允许用户输入五个候选人的姓氏 在当地选举和每位候选人收到的票数。 然后该程序应输出每个候选人的姓名,收到的投票数, 以及候选人收到的总票数的百分比。 你的节目也应该输出选举的胜利者。

'keyword' => array(
                'label'         => __( 'Keyword or Listing ID', 'wpcasa' ) . '…',
                'type'          => 'text',
                'class'         => 'width-3-4',
                'default'       => 'HELLO',
                'priority'      => 10
            ),       

2 个答案:

答案 0 :(得分:5)

问题出现在这里:

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< char,std :: char_traits< char&gt ;,std :: allocator< char> > :: {构造函数}&#39 ;.

注意到这一点可以避免以后出现一些混淆。

答案 1 :(得分:1)

您正尝试使用null构造std::string。从name的初始化列表中删除0或完全删除初始化列表。

string name[5];
相关问题