【问题标题】:CPP array memory allocationCPP 数组内存分配
【发布时间】:2020-08-23 15:01:45
【问题描述】:

这里我在输入 n 之前声明数组长度。数组声明时 n=0。

#include <iostream>
using namespace std;

int main() {
    int n;
    int sum=0;
    int arr[n]={};
    cin >> n;

    for(int i=0;i<n;i++) {
        cin >> arr[i];
        cout << arr[i];
    }
    return 0;
}

对于下面的输入 6 1 2 3 4 5 6

我得到这个输出 1234。

谁能解释一下原因?

【问题讨论】:

  • 您调用了未定义的行为。确定此特定结果的原因需要您的环境的详细信息。
  • 你为什么认为n 会为零?
  • @MikeCAT 试图在hackerrank 平台上运行代码。 hackerrank.com/challenges/simple-array-sum/problem
  • 尽管有些编译器允许int arr[n]={};,但它在标准 C++ 中是无效的,因为长度必须在编译时知道。您应该改用std::vector
  • @Kathapatel 你很幸运。 n 未初始化,可能有任何其他值,读取它会导致未定义的行为。

标签: c++ arrays


【解决方案1】:

这里我在输入 n 之前声明数组长度。

是的,但这不是有效的 C++。这是一个编译器特定的扩展。见Why aren't variable-length arrays part of the C++ standard?

在数组声明时 n=0。

错了。 n 尚未初始化,因此它包含垃圾数据(可能为 0)。读取 n 会调用未定义的行为。

即使n 为 0,循环也会越界访问数组,并再次调用未定义的行为。

讨论调用未定义行为的程序的输出是没有意义的——任何事情都可能发生。唯一合理的事情是避免UB。一些好的做法:

  • 始终将变量初始化为合理的值
  • 使用 std::vector 而不是普通数组/VLA。

【讨论】:

    猜你喜欢
    • 2012-03-23
    • 2011-12-15
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2013-12-09
    相关资源
    最近更新 更多