首页 > 解决方案 > 局部变量无需操作即可更改

问题描述

我正在创建一个简单的快速排序程序,它初始化一个空数组并要求用户输入以确定要排序的元素数量以及要排序的元素。

我遇到的问题是一个局部变量正在被更改,尽管它只在分配后被引用。下面附上代码。

int main()
{
    int amount;
    int numbersarray[] = {};
    std::cout << "How many numbers do you want to sort? " << std::endl;
    std::cin >> amount; 
    for(int i = 0; i <= amount; i++){
        std::cout << "Enter number to be sorted: " << std::endl;
        std::cin >> numbersarray[i]; 
    }
    std::cout <<"Amount to be sorted: " << amount << std::endl;

    for(int i = 0; i <= amount; i++){
        std::cout << numbersarray[i] << std::endl;
    }
}

我期望发生的情况是,当我输入数量为 5 时,我应该能够将 5 个元素输入到数组中,但是打印的数量是 2,我可以放入数组中的最大元素是 3。

下面是执行输出。

How many numbers do you want to sort? 
5
Enter number to be sorted: 
5
Enter number to be sorted: 
2
Enter number to be sorted: 
5
Amount to be sorted: 2
5
2
5

我试过弄乱 for 语句,但我认为我做得不对,因为它没有解决问题,我正在做的 for 语句的操作正在改变条件(即!=, <, <=)

标签: c++variables

解决方案


你有未定义的行为。任何事情都有可能发生。局部变量可以无故更改,程序可能会崩溃,您的计算机可以使用 linux 6.9 自行格式化

有很多问题。首先是你的程序按照标准是无效的:

int numbersarray[] = {};

这是无效的。数组需要一个大小:

constexpr int max_amount = 32;
int numbersarray[max_amount] = {};

如果您需要它是动态的,请使用向量:

std::vector<int> numbersarray;
numbersarray.resize(amount);

其次,您还有另一个未定义行为的来源:

//     Iterates too much, numbersarray[amount] is past the end
//             ~~~v~~~~~~~
for(int i = 0; i <= amount; i++){
    std::cout << "Enter number to be sorted: " << std::endl;
    std::cin >> numbersarray[i]; 
}

它应该是:

for(int i = 0; i < amount; i++){
    std::cout << "Enter number to be sorted: " << std::endl;
    std::cin >> numbersarray[i]; 
}

为避免无效代码和未定义行为,您应该启用警告。


推荐阅读