C++ 中的数组维度
Array dimension in C++
我知道数组需要定义一个不可修改的大小,但是在这段代码中,计数器i超过了数组的大小(因为2 in "i
#include <iostream>
int main() {
int sz;
std::cin >> sz;
int v[sz];
std::cout << "i" << " " << "v[i]" << std::endl;
for(int i=0;i<sz+2;i++){
std::cin >> v[i];
std::cout << i << " " << v[i] << std::endl;
}
return 0;
}
the counter i exceeds the size of the array (because of the 2 in "i<sz+2" in the for loop) but the code don't give any errors, why?
超出数组范围(正如您所做的那样)是未定义的行为。
Undefined behavior means anything1 can happen including but not limited to the program giving your expected output. But never rely(or make conclusions based) on the output of a program that has undefined behavior.
所以您看到(也许看到)的输出是未定义行为的结果。正如我所说,不要依赖具有 UB 的程序的输出。该程序可能 崩溃 .
因此,使程序正确的第一步是删除 UB。 然后并且只有那时你可以开始对程序的输出进行推理。
此外,在标准 C++ 中,数组的大小必须是 编译时间常数。所以当你写道:
int sz;
std::cin >> sz;
int v[sz]; //NOT STANDARD C++
语句 int v[sz];
不是标准 C++,因为 sz
不是 常量表达式。
1有关未定义行为的更准确的技术定义,请参阅 this 其中提到:没有对程序行为的限制.
我知道数组需要定义一个不可修改的大小,但是在这段代码中,计数器i超过了数组的大小(因为2 in "i#include <iostream>
int main() {
int sz;
std::cin >> sz;
int v[sz];
std::cout << "i" << " " << "v[i]" << std::endl;
for(int i=0;i<sz+2;i++){
std::cin >> v[i];
std::cout << i << " " << v[i] << std::endl;
}
return 0;
}
the counter i exceeds the size of the array (because of the 2 in "i<sz+2" in the for loop) but the code don't give any errors, why?
超出数组范围(正如您所做的那样)是未定义的行为。
Undefined behavior means anything1 can happen including but not limited to the program giving your expected output. But never rely(or make conclusions based) on the output of a program that has undefined behavior.
所以您看到(也许看到)的输出是未定义行为的结果。正如我所说,不要依赖具有 UB 的程序的输出。该程序可能 崩溃 .
因此,使程序正确的第一步是删除 UB。 然后并且只有那时你可以开始对程序的输出进行推理。
此外,在标准 C++ 中,数组的大小必须是 编译时间常数。所以当你写道:
int sz;
std::cin >> sz;
int v[sz]; //NOT STANDARD C++
语句 int v[sz];
不是标准 C++,因为 sz
不是 常量表达式。
1有关未定义行为的更准确的技术定义,请参阅 this 其中提到:没有对程序行为的限制.