c++ - 是什么改变了 int a 的值?一个简单的 C++ 问题让我很困惑
问题描述
我在hackerrank上解决了这个介绍问题。当我尝试解决这个问题时,这是一些奇怪的事情。
输入是
4
1 4 3 2
我想将数字读入数组。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a;
int arr[a];
scanf("%d",&a);
for(int i=0; i<=a-1; i++){
scanf("%d",&arr[i]);
printf("i = %d, a = %d\n", i, a);
}
return 0;
}
我得到了输出:
i = 0, a = 4
i = 1, a = 4
i = 2, a = 4
i = 3, a = 2
数组是正确的。我的问题是为什么 int a 的值会改变?为什么改为2而不是3?
如果我重新排列以下几行:
int a;
scanf("%d",&a);
int arr[a];
int a 中的值没有改变,
i = 0, a = 4
i = 1, a = 4
i = 2, a = 4
i = 3, a = 4
解决方案
这是错误的:
int a;
int arr[a];
scanf("%d",&a);
两个问题:您a
在从用户那里读取值之前使用。使用a
unitinitialized 是未定义的行为。您的代码的输出可以是任何东西,也可以什么都不是。那么你不能有一个运行时大小的静态数组。一些编译器支持可变长度数组作为扩展,但它们不是标准的 c++(参见此处)。
如果你想写 C++,那么你应该实际使用 C++。动态大小的数组是std::vector
. 您的代码可能如下所示:
#include <vector>
#include <iostream>
int main() {
int a;
std::cin >> a; // read user input before you use the value
std::vector<int> x(a); // create vector with a elements
for (size_t i=0; i < x.size(); ++i) {
std::cin >> x[i];
std::cout << "i = " << i << " a = " << a << "\n";
}
}
我的问题是为什么 int a 的值会改变?为什么改为2而不是3?
未定义的行为意味着,您的程序的行为是未定义的。编译器不会编译无效代码。如果您确实编译了无效代码,那么可能会发生奇怪的事情。访问arr[i]
是访问一些完全虚假的内存地址,并且可能会发生写入覆盖a
. 但是,重要的是要注意这里发生的事情与 C++ 无关,而是与您的编译器和编译器的输出有关。如果您真的想了解您需要查看程序集的详细信息,但这不会告诉您有关 C++ 如何“工作”的任何信息。您可以使用https://godbolt.org/来做到这一点,但最好注意编译器警告并尝试编写正确的代码。
推荐阅读
- ruby-on-rails - Rails 服务器无法在 docker 容器中启动
- javascript - React Rodal 不适合模式窗口内的文本
- java - Java:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 3 at javaapplication9.Tictactoe.setPlay
- javascript - 图像处理 Discord.js:没有这样的文件或字典
- javascript - THree.js:从正交相机缩放时如何保持精灵文本大小不变
- xmlhttprequest - Tizen 手表网络应用程序,更新后小部件中的 edy 坏了?
- python - 如何在 discord.py 中创建邀请记录器?
- amazon-web-services - 使用 AWS KMS 生成 HMAC-SHA256
- typescript - Typescript Array.isArray 保护语句和函数返回类型
- rust - 无法使用 curl 在 RHEL 6.10 上安装 Rust