繁体   English   中英

初始化动态内存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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM