为什么将此大小变量定义为 const 会导致内存被清零? (包括 godbolt 示例)

Why does defining this size variable as const result in memory being zeroed out? (godbolt example included)

编译器资源管理器示例:https://godbolt.org/z/AEv4Ci

这个代码

int main() {
  const int Size = 16; <-- const
  int arr1[Size];
  int arr2[Size];
  int arr3[Size];
  for (auto I = 0; I < Size; ++I) {
    arr3[I] = arr1[I] + arr2[I];
  }
  return arr3[Size - 1];
}

returns 0

但是这段代码:

int main() {
  int Size = 16; // <-- not const
  int arr1[Size];
  int arr2[Size];
  int arr3[Size];
  for (auto I = 0; I < Size; ++I) {
    arr3[I] = arr1[I] + arr2[I];
  }
  return arr3[Size - 1];
}

returns一个随机数

在这两种情况下,您本质上都是在读取单元化数据,因此程序 return 是垃圾值。 returns 0 只是个意外。例如尝试使用 Size = 14 或其他数字,在 const 情况下它也会 return 一些随机值。

int Size = 16; // <-- not const
int arr1[Size];

此程序在 C++ 中的格式错误,因为非编译时常量值不能用作数组的大小。

arr3[I] = arr1[I] + arr2[I];

arr1[I]arr2[I] 的值不确定。读取不确定值的行为是未定义的。

Why does ... result in ...? ... but this code ... returns a random number

因为在这两种情况下,程序的行为都是未定义的。

第二个密码

int Size = 16; // <-- not const
int arr1[Size];

在 VS C++ 中出错(一些编译器允许)。

代码中arr1、arr2没有初始化,arr1[I]、arr2[I]、arr3[I]的值不确定,赋值“arr3[I] = arr1[I] + arr2[I]; ”有未定义的行为。

未定义的行为表现为取当前存储在arr1[I]、arr2[I]中的任意值并将“+”的结果保存在arr3[I]中。 arr1[I]、arr2[I] 中的具体值可能会在 运行 秒之间或同一 运行.

期间发生变化