当我向 vector<int *> 添加元素时,我遇到了一些问题

when I add elements to the vector<int *>, I meet some problems

本文关键字:遇到 问题 元素 gt vector lt int 添加      更新时间:2023-10-16

这是我的编码:

std::vector<int *>a;
for(i=0;i<3;i++)
{
  int j=i+1;
  int *p=&j;
  a.push_back(p);
}
for(auto &c:a)
{
  std::cout<<*c<<std::endl;  
}

我想让输出为1,2,3,但输出为3,3,33。我似乎已经添加了相同的指针到a,但是我想在循环中添加不同的指针,什么我应该这样做,上述错误是如何发生的?

j具有自动存储持续时间,而指向它的指针仅在 for循环的特殊迭代中有效。p>换句话说,您创建了一个悬挂指针的向量!您提出这样的指针的行为是不确定的

而不是考虑std::vector<int>

(您在输出中反复看到相同的值的事实可能是可能,由于C 运行时在同一内存位置重新创建j。因此,C 标准不坚持这种行为。(

std::vector<int *>a;
for(i=0;i<3;i++)
{
  int j=i+1;
  int *p=&j;
  a.push_back(p);
}

p是堆栈中的地址。此外,jp仅在循环的相应迭代中有效,一旦循环进入下一个迭代或结束,它们就不再显着(j已破坏(。

如果您真的想要指针的向量,则指针需要有效。一种选择是指针指向堆中的对象。另一个选择是指针指向堆栈中永远不会出现范围的对象,即永不破坏。

另一个更好的选择是让对象本身的向量,例如vector<int>