c++ - 局部变量无需操作即可更改
问题描述
我正在创建一个简单的快速排序程序,它初始化一个空数组并要求用户输入以确定要排序的元素数量以及要排序的元素。
我遇到的问题是一个局部变量正在被更改,尽管它只在分配后被引用。下面附上代码。
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] = {};
如果您需要它是动态的,请使用向量:
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];
}
为避免无效代码和未定义行为,您应该启用警告。
推荐阅读
- python - Python(Flask)在输出末尾打印不需要的行
- python - 如何对包含数组中数据的数据框进行排序?
- python - Kivy - 如何从 Urlrequest on_progress / 屏幕刷新更新标签
- wcf - WCF 获得有意义的通道异常
- r - replace_emoticon 函数错误地替换单词中的字符 - R
- azure - 如何降低 Azure Web 应用临时文件的使用率
- java - com.ibm.db2.jcc.am.SqlException:[jcc][10150][10300][3.67.28] 无效参数:未知列名 DeliverAge。错误代码=-4460,SQLSTATE=null
- javascript - 使用 Express 和 MongoDB - 如何注销用户?
- nuxt.js - 如何在 Nuxt 初始化状态存储之前执行代码?
- coreml - CreateML Recommender 训练错误:推荐模型中的项目 ID 必须编号为 0、1、...、num_items - 1