gpt4 book ai didi

c++ - 导致访问冲突错误的数组条目删除

转载 作者:行者123 更新时间:2023-11-28 06:40:42 25 4
gpt4 key购买 nike

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

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 中的值监视器。如果代码在此迭代后继续执行,则会弹出错误消息:

"Unhandled exception at 0x0F6131CA (msvcr120d.dll) in my_program.exe: 0xC0000005: Access violation reading location 0x68FD7339."

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

我希望这不是我没有看到的显而易见的事情,但我真的在这里遇到了困难,因此我们将不胜感激。

最佳答案

如果 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 仅由数据组成,而不是数组末尾的虚拟值或标记值,那么您将无法删除 DB 中的最后一项。最简单的解决方法是声明您的数组 1 条目大于您的预期,并将最后一个条目用作虚拟值。

关于c++ - 导致访问冲突错误的数组条目删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26027070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com