0

コマンドライン引数から文字列をコピーすることになっているクラスを持つプログラムを作成しました。

これが問題のあるコードです。

void FileHandler::SetFile(const char*& filename)
{
    for(unsigned tsr = 0; tsr < 200; tsr ++){
        if(filename[tsr] == 0x0){
            mFilename = new char[tsr];
            strcpy(mFilename, filename);
            mFilenameAllocated = true;
        }
    }
}

コマンド引数はNULLで終了していると想定しているため、このコードブロックは、文字列を新しいメモリスペースにmemcpyする前に、文字列の長さを見つけるためにNULL文字を探します。

私は何を見落としましたか?それとも、このコードは「正しく機能する」必要がありますか?

ありがとう

編集:

strcpyのせいですか?コマンド引数がNULLで終了していない場合、アクセス違反が発生するまで、メモリのセクションに沿って実行されますか?

4

2 に答える 2

3

割り当てられた文字列が1文字短すぎます。

入力がであると想像してください"A"。次に、インデックス1を見つけて、0x01文字を割り当てます。strcpy次に、Aとヌルターミネータをコピーすると、運命になります。

于 2013-02-05T21:45:35.007 に答える
0

問題1:

NULL文字が見つかった後、forループは「中断」しません。これは、未定義の動作を示す場合があることを意味します。(これは、コーディングが長すぎる場合の問題です。)

問題2:

メモリ割り当ては1文字2ショートです。

編集:

貢献者は+1アップされました。

于 2013-02-05T21:52:13.070 に答える