首页 > 解决方案 > 是什么改变了 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

标签: c++arrays

解决方案


这是错误的:

int a; 
int arr[a];
scanf("%d",&a);

两个问题:您a在从用户那里读取值之前使用。使用aunitinitialized 是未定义的行为。您的代码的输出可以是任何东西,也可以什么都不是。那么你不能有一个运行时大小的静态数组。一些编译器支持可变长度数组作为扩展,但它们不是标准的 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/来做到这一点,但最好注意编译器警告并尝试编写正确的代码。


推荐阅读