【问题标题】:vector int pointer and initialization ofvector int 指针和初始化
【发布时间】:2014-04-15 21:44:16
【问题描述】:

我有这个功能:

void getInput(vector<void*> &list)
{
    int qty, large;
    cout<<"How many random numbers do you wish to have? ";
    cin>>qty;
    cout<<"What is the largest number you wish to see? ";
    cin>>large;
    list.resize(qty+1);
    for(int i = 0; i < qty; i++)
    {
        int x = (rand()%(large+1));
        *((int*)list[i])=x;
    }
}

而且它在线上崩溃了

*((int*)list[i])=x;

我被困在如何解决问题上。 我对此很陌生,我一直在搜索书籍和网站......我只要求在正确的轨道上领先。提前谢谢!

【问题讨论】:

  • 为什么它首先包含void *?它可能应该只是一个std::vector&lt;int&gt;
  • 您的向量中有指针,但它们指向任何内容。
  • @chris 这没有帮助。即使在vector&lt;int&gt;,还是会崩溃。
  • @SamHuang,好吧,我的意思是根本不使用它,但似乎由于某种原因你不允许这样做。
  • @SamHuang:如果你有一个vector&lt;int&gt;(你应该在这里)那么你根本没有指针,你只会push新元素_back。没有崩溃,正确的代码。

标签: c++ stdvector void-pointers


【解决方案1】:

首先你不应该使用void*。您可以使用std::vector&lt;int&gt; 并且完全没有问题:

void getInput(std::vector<int>& list)
{
    int qty, large;
    cout<<"How many random numbers do you wish to have? ";
    cin>>qty;
    cout<<"What is the largest number you wish to see? ";
    cin>>large;
    list.resize(qty);
    for(int i = 0; i < qty; i++)
    {
        list[i] = rand()%(large+1);
    }
}

但如果您有兴趣,它导致错误的原因可能是因为您可能取消引用未初始化的指针(如果向量中的值未在函数外部初始化)。

最后,如果你可以使用 C++11,请consider dropping rand 统一生成随机数。

【讨论】:

  • 这个我知道怎么做。但这是一个任务。我必须使用void*。我只是想知道为什么那条线路不起作用?
  • @SamHuang,我已经在代码块之后解释过了。 :)
  • @Jefffery 是的,这就是问题所在。我因为忘记初始化它而失败了。谢谢。
【解决方案2】:

就像@Retired Ninja 所说,你的指针没有指向任何东西,当你取消引用它们时会导致运行时错误。您可以使用@Jefffrey 的解决方案,也可以使用动态内存。例如:

for (int i = 0; i < qty; i++)
{
    list[i] = new int; //now list[i] actually points to something
    int x = (rand() % (large + 1));
    *((int*) list[i]) = x;
}

请记住,这种方法非常危险,可能会导致内存泄漏。

【讨论】:

  • @SamHuang 如果问题解决了,你可以接受我的或者 Jefffrey 的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 2021-03-07
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多