簡體   English   中英

導致訪問沖突錯誤的陣列條目刪除

[英]Array Entry Removal Causing an Access Violation Error

在過去的幾個小時中,我一直在為大學做作業,除一個錯誤外,我幾乎完成了任務。 我設法將錯誤追查到該函數內部的循環中。 該函數應該從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循環退出時達到“計數--;”時發生。 remove_DB內的語句。 上一次在錯誤發生之前執行循環的時間,call_DB [i +1]的值變為:

“ call_DB [i + 1] {cell_num =中繼= 1分鍾= 7116664 ...}”

根據Visual Studio中的值監視器。 如果代碼在此迭代之后繼續執行,則會顯示一個彈出錯誤,顯示以下消息:

“ my_program.exe中0x0F6131CA(msvcr120d.dll)處未處理的異常:0xC0000005:訪問沖突讀取位置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的條目大於您的期望值,並讓最后一個條目用作虛擬值。

基本上,您所需要做的就是找到要刪除的數據的索引,然后將所有內容移至該插槽下方,從而覆蓋要刪除的數據。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM