【发布时间】:2021-05-05 01:16:57
【问题描述】:
如果我像这样int arr[5]; 在 C/C++ 中声明一个数组,然后像这样在其中插入元素的循环
for(int i=0; i<5; i++){
arr[i] = i+1;
}
当我像这样打印这些元素时
for(int i=0; i<5; i++){
printf("%d ", arr[i]);
}
元素照常打印,即1 2 3 4 5
但是如果这些循环像这样再运行一次
for(int i=0; i<=5; i++){
arr[i] = i+1;
}
还有这个
for(int i=0; i<=5; i++){
printf("%d ", arr[i]);
}
然后输出为1 2 3 4 5 6。
所以,我不明白一个大小为 5 的数组本身怎么会有 6 个元素?
【问题讨论】:
-
for(int i=0; i<=5; i++){ arr[i] = i+1; }此代码通过越界访问索引表现出未定义的行为。 “似乎有效”是未定义行为的一种可能表现形式。 -
当我用一根只能承受 900 磅的绳子悬挂 1000 磅的重量时,绳子不会断裂。为什么?这基本上就是你要问的。它可能会破裂,它可能会永远保持下去,它可能会为您的朋友而破裂,但在您尝试时不会破裂,等等。
-
但是一旦我访问 arr[6] 它就会给我一个错误,为什么不在 arr[5]?
-
@ornvyr -- 解释为什么被破坏的代码会以它的方式运行是没有意义的。在另一个编译器、其他编译器设置等上,该代码可能会做不同的事情。
-
(It's complicated)其实很简单,每周至少要问 20 次相同的问题。关闭作为一个非常常见的欺骗