2011-11-11 78 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'); 
相关问题