【问题标题】:Strange bug or am i mssing something?奇怪的错误还是我错过了什么?
【发布时间】:2021-09-06 21:37:59
【问题描述】:

我正在尝试按升序将元素插入到数组中,为了实现这一点,我制作了以下有效的代码。但我想在这里使用“arrSize”而不是 10 for (int i = 0; i < 10; i++)(下面的代码有效)

int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int element = 7;
    int arrSize = sizeof(arr)/sizeof(arr[0]);
    int p = arrSize;
    for (; p && element < arr[p - 1]; --p) 
        arr[p] = arr[p - 1];
    arr[p] = element;
    for (int i = 0; i < 10; i++)
        cout << arr[i] << " ";

为此,我需要增加“arrSize”,但是当我这样做时,我的输出是1 2 3 4 5 6 7 7 8 10(不应该有 10,应该有 9)。 即使我不使用“arrSize”而不是 10(见下文),请不要发生这种情况。

int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int element = 7;
    int arrSize = sizeof(arr)/sizeof(arr[0]);
    int p = arrSize;
    for (; p && element < arr[p - 1]; --p) 
        arr[p] = arr[p - 1];
    arr[p] = element;
    arrSize++;
    for (int i = 0; i < 10; i++)
        cout << arr[i] << " ";

如您所见,我在递增后不使用“sizeArr”,但我的程序给了我错误的输出,这就是我将其称为错误的原因。

发生这种情况的任何原因?

谢谢。

【问题讨论】:

  • arr[p] = arr[p - 1]; 在第一次循环迭代中是 UB。您正在访问数组末尾之后的元素。
  • 数组有固定大小。对于插入,您可以使用可调整大小的容器,例如 std::vector
  • 你不能“插入”到一个固定大小的数组中……
  • 那么插入时应该只丢弃最大的吗?如果你只有 9 个元素,为什么要打印 10 个?我认为您需要修复p的初始值的逐一错误

标签: c++ arrays algorithm loops


【解决方案1】:

您在代码中写入了 arr[9],可能会覆盖堆栈上的其他变量。

arr[9] 中的有效索引为 0..8。其他一切都是未定义的行为

这个:

int arrSize = sizeof(arr)/sizeof(arr[0]);

arrSize 设置为9。在这里:

int p = arrSize;
for (; p && element < arr[p - 1]; --p) 
   arr[p] = arr[p - 1];

您将arr[9] 设置为arr[8]

我只能猜测接下来会发生什么,但由于 element 是在 arr 之后立即声明的,因此此写入有可能改为更改 element

另外,你从 arr 中读取了 10 个元素

for (int i = 0; i < 10; i++)
        cout << arr[i] << " ";

【讨论】:

  • 非常感谢,现在可以降神了。正如@jarod42 评论的那样,我应该使用可调整大小的容器而不是数组。
【解决方案2】:

我认为这差了一个:

当您执行 arr[p] = arr[p-1] 时,您将值推到数组边界的右侧(在为 9 个元素的数组分配的内存之外 - 最高索引为 8 - 因为您从 0 开始!)。

当您执行arrSize++; 时,它不会为数组重新分配内存,因此您最终会打印出数组的所有元素,并在数组之后在内存中分配一个额外的值 - 在这种情况下 - 值 10 (很可能是与arrSize 对应的内存(但这取决于特定情况和使用的编译器)。

为了确保您不会越过已分配内存的边界 - 请确保您预先分配一个更大的内存,或者不要将内存中的项目移到它之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多