2011-10-21 12 views
1

私にとっては、それはとてもシンプルなはずですが、私は何か不足しているように感じます。GNU C++での文字列配列の宣言

私は自分のヘッダファイルにプライベート変数を持っています_stoplist私はヘッダファイルでそれを宣言したとき、コードは次のようになります。

private: 
    std::string _stoplist[]; 

私の機能の後半で、私はこれにアクセスすることに決めました。それは何かをセグメンテーションします。

_stoplist[_length]; 
//cout << _length << prints 104 (its a valid int and everything) 
_stoplist[0] = "b"; 

segfaultでstd :: string.assign()コードがクラッシュします。私はここで何かが分からないと感じているが、まだ何が見つかりませんか?

ありがとうございます!

編集:ありがとう、すべての助けに感謝します。これを読むかもしれない誰かのために、それはそれを行うための賢い方法ですので、私は以下の答えの1つを使用することをお勧めします。私の場合は、なしで動的に割り当てる必要があったので、私はちょうど次のコードを使用しました。

private: 
    std::string *_stoplist; 

、その後、私のcppファイル内

_stoplist = new string[_length]; 

うん、それは本当に道簡単だった、と私はちょうどその部分を見て超えていたことが判明。

+2

このような可変長配列は正当なC++ではなく、GCCの拡張機能です。 – bames53

答えて

2

_stoplistにサイズがないため、配列外のエラーが発生しています。 [0] _stoplistて[99]を

private: 
    std::string _stoplist[100]; 

今あなたは、インデックス_stoplistことができるようになります。あなたはそれをのような大きさ、およびその範囲内でのみアクセス要素を与える必要がありますどちらか。しかし、もっと良い解決策はstd :: vectorを代わりに使用することです。

次に、resize()などのメンバー関数を使用して、必要なサイズに拡大することができます。

+0

std :: vectorを使用したいのと同じくらい、これはクラスの割り当てなので、許可されていません。たぶん、私は質問で明確にしておく必要がありますが、私は動的なサイズにするためにこのリストが必要なので、それはこれを宣言する必要があることを意味します: 'std :: string * _stoplist []'そして '_stoplist [] =新しい文字列[_長さ] '? – Bob

+0

しかし、これは間違いなくこの問題を抱える他の人にとって正しい答えです。 – Bob

+0

@Bob:あなたの先生に彼がばかだと教えてください。可能であれば、単純化した 'vector'をあなた自身に書き直してください。 – GManNickG

1

これは、std::string[]と宣言された変数は基本的にポインタに過ぎないからです。これを使用するには、そのメモリを割り当てる必要があります。固定メモリを割り当てたい場合は、例えば以下のように宣言してみてください。代わりにstd::string _stoplist[5];