2010-08-30 195 views
1

有人可以善意的解釋爲什麼在這個世界上這給我一個分段錯誤的錯誤?陷於簡單的分段故障。 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和我仍然得到分段錯誤。到底是怎麼回事?

我有其他向量ints,他們給我正確的結果。

+0

Dude !! ..你需要修改插入元素到vector中的技能.vector與c中的數組不同。 – Vijay 2010-08-30 10:43:31

+0

如果是VS2010,它會在調試模式下給出一個明確的錯誤消息,說明下標超出範圍 – Chubsdad 2010-08-30 11:29:23

+0

爲什麼您認爲將int更改爲double會消除分段錯誤? – 2010-08-30 15:48:18

回答

2

你正在訪問向量越界。首先,您需要初始化指定尺寸的矢量。

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

你能否向我解釋其他載體如何在沒有指定大小的情況下給我任何問題? 此外,我有一個長向量(0-107向量)指定的大小爲108,仍存在分段錯誤。這是怎麼回事? – Tek 2010-08-30 10:40:45

+0

您可能已經在不同的環境中使用過它們。例如,您可能使用push_back添加元素,或插入函數。如果你給出了實際的代碼示例,那麼我可以發表評論。分段錯誤也可能是由於完全不同的原因。 – Leonid 2010-08-30 10:42:18

+0

你不應該真的聲明這樣的元素,它更好地使用push_back()語法。 – Tomas 2010-08-30 10:43:05

10

更換

freqnote[0] = 16.35; 

freqnote.push_back(16.35); 

,你會沒事的。

錯誤是由於該索引超出範圍。在通過[0]訪問第一個元素時,矢量的容量可能爲0. push_back(),另一方面,將擴大矢量的容量(如有必要)。

7

你不能初始化一個像這樣的矢量元素。

你必須去:

freqnote.push_back(16.35), 

然後訪問它,你會數組

2

正如人們所說的,它是關於在vector插入超出範圍的指標的問題。

一個vector是一個動態大小的數組,它從一個大小爲0,然後你可以擴展/在你的心臟收縮的內容它。

有由索引訪問vector元件的2種方式:

  • vector::operator[](size_t)(僅專家)
  • vector::at(size_t)

(I分配與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())允許您調整向量,追加新的元素,如果它得到的構造函數的重載大於它

兩種方法允許你提供一個元件被複制(示例性)和默​​認複製默認構造的對象(如果0Tint),如果你沒有明確提供範例。

0

除了使用push_back()存儲新元素外,還可以在開始使用vector之前調用resize()一次,以指定它包含的元素的數量。這與分配數組非常相似。