c++ - 局部变量在没有操作的情况下被改变

标签 c++ variables

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

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

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 语句的操作正在改变条件(即!=, <, <=)

最佳答案

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

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

int numbersarray[] = {};

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

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

如果你需要它是动态的,使用 vector :

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

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

关于c++ - 局部变量在没有操作的情况下被改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55026499/

相关文章:

r - 在 dplyr 中使用变量列名 (do)

java - Java如何识别一个位置是否持有原始或引用

c++ - 'const Name &var' 还是 'const Name& var'?

Javascript 构造函数 : Accessing outside variable

c - 为什么全局变量在不同的方法中表现不同?

c++ - Qt:QScriptValueIterator 有一个额外的元素

python - 将变量从一个 Python 脚本发送到另一个

c# - C# COMponent 引发的异常消息是否通过互操作传递给 C++?

c++ - 为什么编译器在 printf 中将 char 转换为 int?

c++ - 防止 MFC 应用程序将光标更改回默认图标