2017-06-24 13 views
2

gccを使用して完全に実行されますが、ビジュアルスタジオ2017で「ベクトル添え字が範囲外です」ランタイムエラーが発生しました。デバッガを使用している場合、countWords(&v, "hello");関数呼び出しでエラーが表示されます。どうすれば修正できますか?ここvC++でランタイムエラーが発生しましたが、gccではありません

#include <iostream> 
#include <vector> 
using namespace std; 

struct Trie { 
    int prefixes; 
    int words; 
    vector<Trie*> edges; 
}; 

typedef Trie vertex; 

void initialize(vertex *v) 
{ 
    v->words = 0; 
    v->prefixes = 0; 
    v->edges.resize(26); 
    for (int i = 0; i < 26; i++) 
    { 
     v->edges[i] = nullptr; 
    } 
} 

void addWord(vertex* v, string word) 
{ 
    if (word == "") 
    { 
     v->words++; 
    } 
    else 
    { 
     v->prefixes++; 
     int k = word[0] - 'a' - 1; 
     if (v->edges[k] == nullptr) 
     { 
      v->edges[k] = new Trie; 
      initialize(v->edges[k]); 
     } 
     int word_len = word.length(); 
     addWord(v->edges[k], word.substr(1, word_len - 1)); 
    } 
} 

int countWords(vertex* v, string word) 
{ 

    char k = word[0]; 
    if (word == "") 
     return v->words; 
    else if (v->edges[k] == nullptr) 
     return 0; 
    else 
     return countWords(v->edges[k], word.substr(1, word.length() - 1)); 
} 

int main() 
{ 
    Trie v; 
    initialize(&v); 
    addWord(&v, "hello"); 
    countWords(&v, "hello"); 
    cin.get(); 
} 
+0

Visual Studioマーケティング名!=コンパイラのバージョン。 Visual StudioはIDEで、MSVCはVisual Studioと共にインストールできるコンパイラです。別々のものです。 GCCのバージョンとMSVCのバージョンの両方を指定してください。 – tambre

+0

gcc 6.0およびmsvc 19.10.25019 – XZ6H

+2

MSVC++には、デバッグビルドでデフォルトで有効にされたイテレータデバッグ機能があり、このプログラムでUBをキャッチするのに便利です。デバッガは、スタックトレースから何がうまくいかなかったかを簡単に表示できます。 'edges 'には26個の要素があり、おそらく' A '..' Z 'を意味します。しかし、あなたは「h」、インデックス104でそれを索引付けしています。Kaboom。 –

答えて

3

まあ:

ベクトル添字範囲

の外:

int countWords(vertex* v, string word) 
{ 

    char k = word[0]; 
    ... 
     else if (v->edges[k] == nullptr) 
    ... 
     return countWords(v->edges[k], word.substr(1, word.length() - 1)); 
} 

k引き起こし、あなたのベクトルがedgesと呼ばれるインデックス化するために有効ではありません 'H' に等しいです

あなたが言及したとおりです。

h

index 104を与えるだろう、とあなたのベクトルは、このようにあなたは間違いなく 未定義の動作を引き起こし、境界の外に行く、26のサイズを有しています。

+0

しかし、なぜgccを使ってコンパイルしたのですか? – XZ6H

+0

これは、未定義の動作@ XZ6Hで起こることです。何が起こるかを確かめることはできません。時にはクラッシュすることもあります。 – gsamaras

+0

@RudyVelthuis今私はそれを手に入れます。 – XZ6H

関連する問題