C++ C+中的意外行为+;:变量根本不被引用,但其值仍会更改

C++ C+中的意外行为+;:变量根本不被引用,但其值仍会更改,c++,C++,在以下代码(对于冒泡排序)中,变量origN在声明后根本没有被引用,但在程序结束时,origN的值输出为1(而不是4): origN的值保持不变,正确输出为4 为什么origN的值会随着n的值而变化?在for循环中,您正在读取和写入数组外部的元素。这是未定义的行为。可能是它改变了origN for(int i = 0; i<n; ++i) { if(arr[i] < arr[i-1]) // <-- `i-1` can be -1 { swap(

在以下代码(对于冒泡排序)中,变量origN在声明后根本没有被引用,但在程序结束时,origN的值输出为1(而不是4):

origN的值保持不变,正确输出为4


为什么origN的值会随着n的值而变化?

for
循环中,您正在读取和写入数组外部的元素。这是未定义的行为。可能是它改变了
origN

for(int i = 0; i<n; ++i)
{
    if(arr[i] < arr[i-1]) // <-- `i-1` can be -1
    {
        swap(arr[i],arr[i-1]); // <--
        swapped = true;
    }
}

for
循环中,您正在读取和写入数组外部的元素。这是未定义的行为。可能是它改变了
origN

for(int i = 0; i<n; ++i)
{
    if(arr[i] < arr[i-1]) // <-- `i-1` can be -1
    {
        swap(arr[i],arr[i-1]); // <--
        swapped = true;
    }
}

for
循环中,您正在读取和写入数组外部的元素。这是未定义的行为。可能是它改变了
origN

for(int i = 0; i<n; ++i)
{
    if(arr[i] < arr[i-1]) // <-- `i-1` can be -1
    {
        swap(arr[i],arr[i-1]); // <--
        swapped = true;
    }
}

for
循环中,您正在读取和写入数组外部的元素。这是未定义的行为。可能是它改变了
origN

for(int i = 0; i<n; ++i)
{
    if(arr[i] < arr[i-1]) // <-- `i-1` can be -1
    {
        swap(arr[i],arr[i-1]); // <--
        swapped = true;
    }
}

基本问题是您实际上在arr阵列上下溢

当n变为0时,您将进行交换(arr[i],arr[i-1]);其中i==0

在您的示例中,arr和originN都是在堆栈上分配的,并且彼此相邻。下溢会导致覆盖原始值


如果在堆上分配阵列,则不会发生这种情况,尽管您仍然保持下溢(并覆盖堆位置&arr[-1]处的内存)。

基本问题是,您实际上在arr阵列上下溢

当n变为0时,您将进行交换(arr[i],arr[i-1]);其中i==0

在您的示例中,arr和originN都是在堆栈上分配的,并且彼此相邻。下溢会导致覆盖originN的值


如果在堆上分配阵列,则不会发生这种情况,尽管您仍然保持下溢(并覆盖堆位置&arr[-1]处的内存)。

基本问题是,您实际上在arr阵列上下溢

当n变为0时,您将进行交换(arr[i],arr[i-1]);其中i==0

在您的示例中,arr和originN都是在堆栈上分配的,并且彼此相邻。下溢会导致覆盖originN的值


如果在堆上分配阵列,则不会发生这种情况,尽管您仍然保持下溢(并覆盖堆位置&arr[-1]处的内存)。

基本问题是,您实际上在arr阵列上下溢

当n变为0时,您将进行交换(arr[i],arr[i-1]);其中i==0

在您的示例中,arr和originN都是在堆栈上分配的,并且彼此相邻。下溢会导致覆盖originN的值


如果您在堆上分配数组,则不会发生这种情况,尽管您仍然保持下溢(并覆盖堆位置&arr[-1]处的内存)。

swap(arr[0],arr[-1])
循环在结束时溢出arr@camelccc循环访问数组“正前方”的元素。
swap(arr[0],arr[-1])
循环结束时溢出arr@camelccc循环访问数组“正前方”的元素。
swap(arr[0],arr[-1])
您的循环溢出了数组的末尾arr@camelccc循环访问数组“正前方”的元素。
swap(arr[0],arr[-1])
循环结束时溢出arr@camelccc循环访问数组“就在”之前的元素。