当我将1个数组放入一个非常简单的for循环时,以及当我将两个数组放入其中时,我无法理解为什么输出会有所不同。
int arrR[100];
int arrN[100];
//function to run the simulation
void runsim(){
for(int i=1;i<=100;i++){
arrN[i] = i;
arrR[i] = i;
}
}
//function to print the array
void printarr(int x[100]){
for(int i=0;i <= 100;i++){
cout << x[i] << ", ";
}
cout << endl;
}
int main(){
runsim();
printarr(arrR);
printarr(arrN);
return 0;
}
这输出arrR为:0,1,2,3,4,5,6,...,100这是我想要的,但是 它输出arrN为:100,1,2,3,4,5,6,...,100,我不明白。
如果我从for循环中删除arrR arrN打印我想要的方式
int arrR[100];
int arrN[100];
//function to run the simulation
void runsim(){
for(int i=1;i<=100;i++){
arrN[i] = i;
}
}
//function to print the array
void printarr(int x[100]){
for(int i=0;i <= 100;i++){
cout << x[i] << ", ";
}
cout << endl;
}
int main(){
runsim();
printarr(arrN);
return 0;
}
输出arrN为0,1,2,3,4,5,6,...,100
有趣的是,如果我将代码中的所有100个更改为10,那么即使我将两个数组都保留在for循环中,这个问题也会消失。
任何人都可以帮助我理解我错过的内容吗?我确信它很简单,因为我对C ++很陌生。谢谢!
答案 0 :(得分:4)
请注意for
的条件为i<=100
,等号表示您将按arrN[100]
访问数组,然后退出界限。这是undefined behavior,一切皆有可能。有效范围应为[0, N)
(N
= 100
),即arrN[0]
,...,arrN[N - 1]
(即arrN[99]
)。
您可能希望将所有条件更改为i < 100
。
答案 1 :(得分:2)
请注意,从0
而不是1
开始的数组索引在n-1
而不是n
处结束。现在,在您的函数runsim()
中,您正在访问分配值100
至arrN[100]
和arrR[100]
这是不可能导致undefined behavior。
您应该更改for循环条件
for(int i = 0; i < 100; i++) {
// Do something.
}
请注意,访问元素输出绑定也不会产生任何错误。有关详细信息,请参阅Accessing an array out of bounds gives no error