在下面的代码中,我希望在1
数组中的所有10
元素中初始化x
。但是,它似乎没有起作用。我可以知道我在这里缺少什么吗?
int main() {
int *x = new int[10];
for(int i =0; i <10; ++i){
*x = 1;
x++;
}
for(int i = 0; i < 10; ++i)
std::cout<<i<<" is "<<x[i]<<std::endl;
return 0;
}
答案 0 :(得分:5)
当你结束初始化循环时,你的x指向超出最后分配的元素。在第二个forloop之前,你需要重新调整x以指向内存的开始
x -= 10;
更好的方法是将你的行走指针作为副本
int *xcopy = x;
for(int i =0; i <10; ++i){
*xcopy = 1;
xcopy++;
}
或使用索引来更新值
for(int i =0; i <10; ++i){
x[i] = 1;
}
答案 1 :(得分:4)
你在第一个循环中递增x
,所以在它之后它指向数组的末尾。第二个循环使用该新值从内存中读取超出结尾,给出未定义的行为。
最好的选择是停止玩弄指针,具有修复内存泄漏的额外功能:
std::vector<int> x(10, 1);
for(size_t i = 0; i < x.size(); ++i) {
std::cout<<i<<" is "<<x[i]<<std::endl;
}
否则,您可以在第一个循环中分配给x[i]
而不是*x
,并保持x
不被修改;或者您使用指针的副本,或在循环后撤消修改。
答案 2 :(得分:3)
您的代码有未定义的行为,因为您正在访问某些随机内存(您已更改x
)。
您不应该更改x
(指针)。相反,您可以使用x[ i ] = 1;
或使用其他临时指针来循环播放&#34; X
你也可以递减x
,正如@Mohit Jain所述,但我不建议改变x
点的位置。