【问题标题】:C++ for loop outputs different results with one array than multiple arraysC++ for 循环输出一个数组与多个数组不同的结果
【发布时间】:2016-08-29 01:53:42
【问题描述】:

当我将 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++ 还很陌生。谢谢!

【问题讨论】:

  • for(int i=1;i&lt;=100;i++) ... 问题已经存在:数组在 C++ 中是从零开始的。您正在尝试访问不应访问的内存区域。
  • 没有x[100] 供您访问

标签: c++ arrays for-loop


【解决方案1】:

注意for的条件是i&lt;=100,等号表示你将通过arrN[100]访问数组,然后出界。这是undefined behavior,一切皆有可能。有效范围应为[0, N)N = 100),即arrN[0],...,arrN[N - 1](即arrN[99])。

您可能希望将所有条件更改为i &lt; 100

【讨论】:

  • 哇,谢谢!我知道这会很简单。
【解决方案2】:

请注意,数组索引从0 开始而不是1 结束于n-1 而不是n。现在在您的函数runsim() 中,您正在访问分配值100arrN[100]arrR[100],这不可能导致undefined behavior

你应该改变for循环条件

for(int i = 0; i < 100; i++) {
 // Do something.
}

请注意,越界访问元素也不会产生任何错误。更多详情请参考Accessing an array out of bounds gives no error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多