难以理解一个简单的分段错误。 C ++

时间:2010-08-30 10:36:35

标签: c++

有人可以善意解释为什么这个世界会给我一个分段错误错误吗?

#include <vector>
#include <iostream>

using namespace std;

vector <double>freqnote;

int main(){

freqnote[0] = 16.35;

cout << freqnote[0];

return 0;
}

我在代码中有其他向量,这是唯一似乎给我带来麻烦的向量。

我将其更改为vector<int>freqnote;并将值更改为16,我仍然得到分段错误。发生了什么事?

我有其他矢量注释,它们给我正确的结果。

5 个答案:

答案 0 :(得分:10)

替换

freqnote[0] = 16.35;

freqnote.push_back(16.35);

你会没事的。

错误是由于该索引超出范围。在您通过[0]访问第一个元素时,向量的容量可能为0. push_back(),另一方面,将扩展向量的容量(如果需要)。

答案 1 :(得分:7)

你不能在这样的矢量中初始化一个元素。

你必须去:

freqnote.push_back(16.35),

然后像访问数组一样访问它

答案 2 :(得分:2)

你正在访问向量越界。首先,您需要初始化指定其大小的向量。

int main() {
    vector<int> v(10);
    v[0] = 10;
}

答案 3 :(得分:2)

如前所述,这是一个关于在vector中插入超出范围索引的问题。

vector是一个动态大小的数组,它的大小为0,然后您可以根据内容扩展/缩小它。

有两种方法可以通过索引访问vector元素:

  • vector::operator[](size_t)(仅限专家)
  • vector::at(size_t)

(我放弃了const重载)

两者都具有相同的语义,但是第二个是“安全的”,因为它将执行边界检查并抛出std::out_of_range异常,以防你被绑定。

我热烈建议您使用 执行所有访问。

对于大多数用例而言,性能损失可以被忽略。 operator[]只应由专家使用,在他们对代码进行分析后,这个地方被证明是一个瓶颈。

现在,要在vector中插入新元素,您有几种选择:

  • push_back会追加一个元素
  • insert会将元素插入iterator所指向的元素前面

根据您希望的语义,两者都要考虑。当然,两者都会使vector适当增长。

最后,您还可以明确定义大小:

  • vector(size_t n, T const& t = T())是构造函数的重载,允许您指定大小
  • resize(size_t n, T const& t = T())允许您调整矢量大小,如果元素大于它,则追加新元素

两种方法都允许您提供要复制的元素(示例),默认情况下复制默认构造对象(如果0T,则int)明确提供范例。

答案 4 :(得分:0)

除了使用push_back()存储新元素之外,还可以在开始使用向量指定它包含的元素数之前调用resize()一次。这与分配数组非常相似。