为什么将此大小变量定义为 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] 中的具体值可能会在 运行 秒之间或同一 运行.
期间发生变化
编译器资源管理器示例: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] 中的具体值可能会在 运行 秒之间或同一 运行.
期间发生变化