数组条目删除导致访问冲突错误

时间:2014-09-24 21:45:48

标签: c++ arrays

过去几个小时我一直在为大学工作,除了一个错误,我几乎已经完成了。我设法将错误追踪到此函数内的循环。该函数应该从call_DB数组中删除所需的条目,然后将以下条目向上移动一个索引号,然后将计数减1,这样在数组中不会留下空白空间,稍后将其打印到文本文件中。这个功能在这里:

void remove_DB(call_record call_DB[], int & count, string cell_number)
{

   int location = search_DB(call_DB, count, cell_number);

   while (location != -1)
   {
        location = search_DB(call_DB, count, cell_number);

        if (location != -1)
        {
          for (int i = location; i < count; i++)
          {
            call_DB[i] = call_DB[i + 1];
          }

          count--;
        }

   }
 }

如果它是相关的,则搜索功能查看用户定义的类数组(对不起,如果这是错误的术语)并返回搜索条目的位置的索引“i”。如果没有找到,则返回-1。那段代码在这里:

int search_DB(call_record call_DB[], int count, string cell_number)
{

 int i;

   for (i = 0; i < count; i++)
   {

      if (call_DB[i].cell_num == cell_number)
      {
        return i;
      }
      return -1;
   }

}

具体来说,错误发生在for循环退出'count - - ;'之后remove_DB中的语句。循环在错误发生之前执行的最后一次call_DB [i + 1]的值变为:

  

“call_DB [i + 1] {cell_num = relays = 1 minutes = 7116664 ...}”

根据Visual Studio中的值监视器。如果代码在此迭代后继续执行弹出错误,则会显示消息:

  

“my_program.exe中0x0F6131CA(msvcr120d.dll)处的未处理异常:0xC0000005:访问冲突读取位置0x68FD7339。”

随后在Visual Studio中打开一个选项卡,告诉我找不到memcpy.asm。

我希望这不是显而易见的事情,我没有看到,但我真的很难过,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

如果i == count-1,且DB是一个包含count条目的数组,则DB[i + 1]超出界限:

for (int i = location; i < count; i++)
{
  call_DB[i] = call_DB[i + 1];
}

应该是:

for (int i = location; i < count-1; i++)
  call_DB[i] = call_DB[i + 1];

其次,你的搜索循环是错误的。如果项目不在数组中的位置0,则始终返回-1。

应该是:

   for (int i = 0; i < count; i++)
   {
        if (call_DB[i].cell_num == cell_number)
        return i;
   }
   return -1;

但是你有另一个问题,那就是如果DB由纯数据组成,而不是数组末尾的虚拟或标记值,那么你将无法删除数据库中的最后一项。最简单的解决方法是声明您的数组1条目大于您的预期,并将最后一个条目用作虚拟值。

答案 1 :(得分:0)

基本上,您需要做的就是找到要删除的数据的索引,然后将所有内容移到一个插槽下面,从而覆盖您要删除的数据。

void remove_DB(call_record call_DB[], int & count, string cell_number)
{

   int location = search_DB(call_DB, count, cell_number);

   if (location < 0)
      return;

   for (location; location < count - 1; location++)
   {
       call_DB[location] = call_DB[location+1];
   }
   count--;
   return;
}