2011-11-11 108 views
6

試圖從矢量初始化字符串。我應該得到「嘿」作爲輸出。但我得到了「分段錯誤」。我做錯了什麼?vector <char> to string segmentation fault

//write a program that initializes a string from a vector<char> 
#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 
int main() 
{ 
    vector<char> cvec; 
    cvec[0]='h'; 
    cvec[1]='e'; 
    cvec[2]='y'; 
    string s(cvec.begin(),cvec.end()); 
    cout<<s<<endl; 
    return 0; 
} 
+1

爲了增加Mysticial的答案 - 'cvec [0]' (和其他訪問)不會調用邊界檢查,並且您的向量沒有元素,因此您正在訪問尚未分配給您的某些內存。 – birryree

回答

21

矢量類的大小從零開始(默認情況下)。所以這樣做會導致未定義的行爲。 (在你的情況下,分段錯誤)

您應該使用push_back()代替:

vector<char> cvec; 
cvec.push_back('h'); 
cvec.push_back('e'); 
cvec.push_back('y'); 

這將每個char追加到矢量。

+0

謝謝,工作。或者我必須聲明它帶有初始值設定項。 「vector cvec(1);」 – ihm

+2

如果使用'push_back()',它的方式很好。你不需要初始化器。 – Mysticial

+1

如果要將矢量用作C風格的字符串,可以添加'cvec.push_back(0);'以添加終止的空字符。 –

11

您需要在矢量分配空間,就像這樣:

vector<char> cvec(3); 

或由一個推字符之一:

vector<char> cvec; 
cvec.push_back('h'); 
cvec.push_back('e'); 
cvec.push_back('y'); 
相關問題