2011-11-11 16 views
6

tratando de inicializar una cadena de un vector. Se supone que debo obtener "hey" como salida. pero obtuve "falla de segmentación". ¿qué hice mal?vector <char> a fallo de segmentación de cadena

//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

Para añadir a la respuesta de Mysticial - 'cvec [0]' (y los otros accesos) no invocan una verificación de límites, y su vector no tiene elementos, por lo que está accediendo a una pieza de memoria que todavía no le ha sido asignada. – birryree

Respuesta

21

La clase vectorial comienza con un tamaño de cero (por defecto). Hacer eso provocará un comportamiento indefinido. (En su caso, un fallo de segmentación)

Debe utilizar push_back() lugar:

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

Esto añadirá cada char al vector.

+0

gracias, trabajado. o tengo que declararlo con un inicializador. "vector cvec (1);" – ihm

+2

Si usa 'push_back()', está bien tal como está. No necesitas un inicializador. – Mysticial

+1

Si desea utilizar el vector como una cadena de estilo C, puede agregar 'cvec.push_back (0);' para agregar el carácter nulo de terminación. –

11

es necesario asignar espacio en el vector, así:

vector<char> cvec(3); 

o empujar los caracteres de uno en uno:

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