初始化动态内存c ++

时间:2015-05-13 11:15:30

标签: c++

在下面的代码中,我希望在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;
}

3 个答案:

答案 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点的位置。