我正在查看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;
}
答案 0 :(得分:1)
即使将数组res
的大小设置为一个元素,也会有未定义的行为。
问题是您尝试使用数组的n
元素,并创建一个空(不允许)数组。即使您创建了一个元素的数组,它也会变小以适合所有值。
当你走出界限时,你会有未定义的行为。
使n
成为编译时常量,并将其用作res
的大小。或者如果n
确实是可变的并且可以从用户输入,那么您应该使用std::vector
。
您显示的代码和循环中发生的真正是std::transform
调用将超出写入res
的范围,并将覆盖的值n
。