0

私はこの関数の読み取りに取り組んでいました。私が使用したmainファイルI/Oには問題はなく、正常に接続され、閉じられ、ファイルも問題ありません。しかし、読み取りの終わりまでにセグメンテーション違反が発生しています。テストのために印刷しようとしましたが、エラーは最後の行を読み取っています。文字列の最後の行の読み取りを終了しa、次に、、xそしてin.good()falseになります。また、 falseになった場合in.clear()は文字列を設定してリセットしてみました。何も機能していません。a="";in.good

read(istream& in){
    string a;
    int x;
    in>>a;
    while( in.good() ){
        in>>x;
        char *ch;
        strcpy( ch, a.c_str() );
        Word cwd(ch);
        anObject.add(cwd,x);   
    }
}
4

2 に答える 2

8

にスペースを割り当てていないためにセグメンテーション違反が発生しch、その上に文字列をコピーしようとしています。chは、自分のものではない初期化されていないメモリアドレスです。

文字列にスペースを割り当てる必要があります。

char *ch = new[(MAX_SIZE + 1) * sizeof(char)];

しかし、なぜここが必要なのchar *ですか?C文字列が必要な場合は、いつでも渡してa使用できることに注意してください。何であるか、または文字列の独自のコピーが必要かどうかはa.c_str()わかりませんが、次を使用できますか?WordWord cwd(a.c_str())

于 2012-08-06T02:10:54.760 に答える
0

にメモリストレージを割り当てていないようですchar *ch。この変数を定義すると、スタック上のランダムな値になります。ランダムメモリを書き込むと、メモリが破損し、メモリをクリーンアップするときにセグメンテーション違反が発生します(手動または関数の戻り時に自動的に)。

于 2012-08-06T02:10:55.747 に答える