无需操作即可更改局部变量

时间:2019-03-06 15:21:12

标签: c++ variables

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

我遇到的问题是尽管只引用了一次变量,但该变量仍在更改。下面是代码。

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

2 个答案:

答案 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[] = {};,因为不允许空初始化器用于大小未指定的数组)。

写入或读取其元素会导致未定义的行为(可能是访问冲突,更改不相关的变量等等)。这就是为什么您可能会看到局部变量的值发生变化的原因。使用相同代码的其他人可能会获得完全不同的行为,因为它是未定义的。