1

はい、私はこの種の問題を抱えています。なぜなら、私は常にポインター操作に従うのが難しいからです。だから、私はこの単純なコードを持っています:

struct myfile {
    char* name;
    char* content;
    long size;
};

myfile this_file;

int main() {
    read();
    return 0;
}

void read() {
    output("Please, specify file name: ");
    cin >> (this_file.name = new char);
    FILE *stream;
    stream = fopen(code.name, "r");
    if (stream != NULL) {
        fseek(stream , 0, SEEK_END);
        myfile.size = ftell(codefile);
        myfile.content = new char[myfile.size];
        fseek(myfile, 0, SEEK_SET);
        if ((fread(myfile.content, 1, myfile.size, stream)) == 0) {
            fclose(codefile);
            cout << "File is empty!\n");
        }
    }
 }

ファイルの名前を正しく取得し、コンテンツのサイズを取得しますが、contentメンバーにスペースを割り当てようとすると、プログラムがクラッシュします。これは、いくつかのポインタの問題であることがわかっていますが、いつものように、何を覚えているかわかりません。それは...ですか。この行に到達するとクラッシュします。myfile.content = new char[myfile.size];

また助けが必要です。ありがとう!

4

3 に答える 3

6

これにより、バッファオーバーランが発生しています。

cin >> (this_file.name = new char);

operator>>()次の空白文字までの文字を消費し、単一の文字に十分なスペースしかない書き込みを行うthis_file.nameためです。

std::stringで(の代わりにchar*)を使用しstd::getline()ます:

std::string name;
if (std::getline(cin, name))
{
    // Use 'name'.
}

ポインタを調査している場合は、の配列を割り当て、割り当てられた配列をchar超えて読み取られないようにする必要があります。

this_file.name = new char[32];
if (cin.getline(this_file.name, 32))
{
}

覚えておいて、deleteまたdelete[]はとは何か。newnew[]

std::stringファイルのコンテンツを読み取ってストリームを使用するための代替手段があります。C++でファイル全体をstd::stringに読み込むための最良の方法は何ですか?を参照してください。。

于 2012-11-28T15:08:26.203 に答える
3

これがポインタの問題について説明していることを明確にするために、本番コードではこのようなポインタを使用しないでください。文字列またはベクトルを使用してください。

この行:-cin >>(this_file.name = new char); 少しです....奇妙です

これを行うことは合法ですが、これを見て経験豊富なC++プログラミングは驚くでしょう。

さらに、終了するヌル文字を格納するのに十分であるが実際のテキストを格納しない単一の文字のみを割り当てます。

このようなことをしてください-

this_file.name = new char[100];
cin >> this_file.name;

他の人が言っているように、学習を除いて実際にはこれを行わないでください。入力がどれだけ大きくなるかを推測する必要があり、ユーザーがさらに送信すると問題が発生します。ブラウザなどで読んだセキュリティバグはすべてありますか?これが彼らが起こる方法です!:)

this_fileという変数を作成し、次の部分で「コード」と呼ばれることを期待しているなど、このコードには他の問題があるようです。そのため、このポインターの問題をさらに修正する必要があります。

また、最後にメモリを解放するには、「delete[]this_file.name」を忘れないでください。ここで独自のメモリ割り当てを本当に使用したい場合は、代わりにstd::unique_ptrを使用することをお勧めします。

于 2012-11-28T15:17:39.963 に答える
0

char*の代わりにstd::stringを使用し、FILE*の代わりにstd:: ifstreamを使用すると、すべての問題が解決されます。

于 2012-11-28T15:08:06.650 に答える