for循环使得值超出c ++中的条件

时间:2018-02-14 04:27:29

标签: c++11 for-loop stl

我正在查看STL下来自this link的c ++的std :: transform()函数示例, 我所理解的是,它用于添加两个数组并将它们保存在结果中(res res)。 所以我试图将res的大小限制为size 1 (res[0]),并且我期待一些编译时错误,如下面的for循环它试图提取i< n,(此处n = 3,指数超出范围)。

但是我的程序增加了8倍。 有人可以解释一下原因,还有一件事,变换类似于python' s res = [x+y for x,y in zip(arr1,arr2)],感谢提前:)。

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
  int arr1[]= {1,2,3};
  int arr2[]= {4,5,6,7}; // should be greater than arr1 size

  int n = sizeof(arr1)/sizeof(arr1[0]);
  cout<<"n = "<<n<<endl;
  int res[0];
  cout<<"res[0] = "<<res[0]<<endl;

  transform(arr1,arr1+n,arr2, res, plus<int>());

  for(int i= 0; i < n; i++) {
  cout<<"i = "<<i<<" res[i] = "<<res[i]<<endl;
  }
  cout<<endl;
  return 0;
}

enter image description here

1 个答案:

答案 0 :(得分:1)

即使将数组res的大小设置为一个元素,也会有未定义的行为。

问题是您尝试使用数组的n元素,并创建一个空(不允许)数组。即使您创建了一个元素的数组,它也会变小以适合所有值。

当你走出界限时,你会有未定义的行为

使n成为编译时常量,并将其用作res的大小。或者如果n确实是可变的并且可以从用户输入,那么您应该使用std::vector

您显示的代码和循环中发生的真正std::transform调用将超出写入res的范围,并将覆盖的值n