我正在创建一个简单的快速排序程序,该程序初始化一个空数组,并要求用户输入以确定要排序的元素数量和要排序的元素。
我遇到的问题是尽管只引用了一次变量,但该变量仍在更改。下面是代码。
passport.deserializeUser(async (id, done) => {
const sql = 'SELECT * FROM users WHERE id = ?'
const fields = [id]
try {
const [user] = await conn.query(sql, fields)
if (user.length === 0) return done(null, false)
return done(null, user[0])
} catch (err) {
return done(err)
}
})
我期望发生的事情是,当我将数量输入为5时,我应该能够将5个元素输入到数组中,但是打印的数量是2,而我可以放入数组中的最大元素是3。
下面是执行输出。
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;
}
}
我试图弄乱for语句,但是我认为我做的不正确,因为它不能解决问题。我正在执行的for语句的操作正在改变条件(即!=,<,<=)
答案 0 :(得分:5)
您的行为不确定。什么都可能发生。局部变量可以无故更改,程序可能会崩溃,并且您的计算机可以使用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];
}
为避免代码无效和未定义的行为,应启用警告。
答案 1 :(得分:1)
numbersarray
是一个C样式的数组,大小为零,并且不会动态调整其大小(大多数编译器甚至可能无法编译int numbersarray[] = {};
,因为不允许空初始化器用于大小未指定的数组)。
写入或读取其元素会导致未定义的行为(可能是访问冲突,更改不相关的变量等等)。这就是为什么您可能会看到局部变量的值发生变化的原因。使用相同代码的其他人可能会获得完全不同的行为,因为它是未定义的。