运行时检查失败 #2,AND 数组值与输出交换不正确

Run Time Check Failure #2, AND array values swapped with outputs incorrectly

本文关键字:输出 交换 不正确 数组 AND 检查 失败 运行时      更新时间:2023-10-16

我已经为这篇文章苦苦挣扎了一段时间了。我已经用谷歌搜索了运行时检查失败,我不知道该怎么办。从我得到的,这是因为我声明了 swapEven 和 swapOdd 有一个大小为 0 的数组?我最初将其设置为指针数组,但这不起作用。有人可以指出我正确的方向吗?提前感谢!

void arrangeArrayJesseRagsdale(int* ary1, int* ary2, int arraySize1, int arraySize2) {
  int i, j;
  int temp;
  int swap = 0;
  int* swapEven = 0;
  int* swapOdd = 0;
  swapEven = new int[arraySize1];
  swapOdd = new int[arraySize2];
  cout << "  Original Arraysn    Array #1: ";
  for (i = 0; i < arraySize1; i++) {
    cout << ary1[i] << " ";
  }
  cout << endl << "    Array #2: ";
  for (i = 0; i < arraySize2; i++) {
      cout << ary2[i] << " ";
  }
  cout << endl;
  for (i = 0; i < arraySize1; i++) {
      for (j = 0; j < arraySize2; j++) {
      if (ary1[i] % 2 != 0) {
        if (ary2[j] % 2 == 0) {
          temp = swapOdd[i] = ary1[i];
          ary1[i] = swapEven[i] = ary2[j];
          ary2[j] = temp;
          swap++;
        }
      }
      }
  }
  cout << "n  Updated Arraysn    Array #1: ";
  for (i = 0; i < arraySize1; i++) {
    cout << ary1[i] << " ";
  }
  cout << endl << "    Array #2: ";
  for (i = 0; i < arraySize2; i++) {
    cout << ary2[i] << " ";
  }
  cout << endl;
  if (swap > 0) {
        cout << "n  Swapping info -n";
    for (i = 0; i < swap; i++) {
        cout << "    Array #1 value " << swapOdd[i] << " swapped with Array #2 value " << swapEven[i] << endl;
    }
  }
  cout << "nThere is/are " << swap << " swap(s)." << endl << endl;
  delete[] swapEven;
  delete[] swapOdd;
  return;
}

首先,你的数组在这里:

 int swapEven[] = {0};
 int swapOdd[] = {0};

每个有 1 个元素。

其次,您的循环使用 arraySize1arrraySize2 来索引到上面的数组中。 代码中没有任何检查来确保对这些数组的索引在边界内。 很可能,这是发生错误的地方,那就是越界访问数组。

如果您的目标是创建具有相同数量元素的数组,请使用std::vector

#include <vector>
//...
std::vector<int> swapEven(arraySize1, 0);
std::vector<int> swapOdd(arraySize2, 0);

代码的其余部分保持不变。

swapEvenswapOdd 的大小不为零,它们是包含单个整数元素的数组,0 .因此,这些数组的长度为 1。

但是,从

我从您的代码中可以看出,您需要声明swapOdd至少具有与ary1一样多的元素。同样,swapEven需要至少具有与ary2一样多的元素。这是因为您使用 ary1ary2 的索引在这些数组中存储值。写入未分配的内存可能会导致您看到的崩溃。

此外,使用 2 个数组的索引将导致交换的值以 swapOddswapEven 进行不连续的存储。这样做的影响是,交换报告代码在生成报告时将使用错误的数组元素。

最好使用动态"列表"数据结构来累积交换的元素。C++那里有一些替代方案,例如 listvector,可以使用它们来代替交换数组。

另一件事,与其使用指针算法来访问数组ary1ary2的元素,不如使用数组索引更具可读性,即

ary[i]

而不是

*(ary1 + i)