![](/img/trans.png)
[英]Dynamic memory allocation - default-initialization of primitive types in c++
[英]Initialization of dynamic memory c++
在下面的代码中,我希望在x
数组的所有10
元素中初始化1
。 但是,它似乎没有起作用。 我可以知道我在这里缺少什么吗?
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;
}
当您结束初始化循环时,您的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;
}
你在第一个循环中递增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
修改; 或者您使用指针的副本,或在循环后撤消修改。
您的代码具有未定义的行为,因为您正在访问一些随机内存(您已更改x
)。
你不应该改变x
(指针)。 相反,你可以使用x[ i ] = 1;
或使用一些其他临时指针“循环”x。
您也可以递减x
,如@Mohit Jain所述,但我不建议更改x
指向的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.