2011-11-11 13 views
6

próbuje zainicjować ciąg znaków z wektora. Mam otrzymać "hej" jako wynik. ale dostałem "błąd segmentacji". co zrobiłem źle?wektor <char> na ciąg segmentacji błędu

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

Aby dodać odpowiedź Mysticial za - 'cvec [0]' (i inne wejścia) nie powołuje się na kontrolę granic, a twój wektor nie ma elementów, więc uzyskujesz dostęp do części pamięci, która nie została jeszcze przydzielona. – birryree

Odpowiedz

21

Klasa wektorowa rozpoczyna się od wielkości zero (domyślnie). Czyniąc to spowoduje niezdefiniowane zachowanie. (W przypadku, usterka segmentacji)

Należy użyć push_back() zamiast:

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

To doda każdej char do wektora.

+0

dzięki, pracował. lub muszę zadeklarować go z inicjatorem. "wektor cvec (1);" – ihm

+2

Jeśli używasz 'push_back()', to jest w porządku tak, jak jest. Nie potrzebujesz inicjatora. – Mysticial

+1

Jeśli chcesz użyć wektora jako łańcucha w stylu C, możesz dodać 'cvec.push_back (0);', aby dodać kończący znak null. –

11

trzeba przydzielić miejsca w wektorze, tak:

vector<char> cvec(3); 

Albo zepchnięcie znaków w jeden po drugim:

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