我尝试运行程序时收到此通知。
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
),
答案 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];