1

次のコードがあります。

if (myFile.is_open()) {
    int i = 0;
    while (myFile.good()) {
        char *ptr = &(reinterpret_cast<char*>(&mem[0]))[i];
        myFile.read(ptr, sizeof(struct req));
        cout << ptr << endl;
        i += sizeof(struct req);
    }
}

ここでのループの cout は何も出力しないように見えますが、代わりに何かを実行すると正しい値が出力されるため、コードが確実にメモリを設定していることはわかっていますcout << mem[5]。基本的に、参照しているものの内容を印刷したいだけですptr。これはおそらくばかげた質問ですが、ここで何が問題なのか知っている人はいますか?

4

2 に答える 2

3

cout << ptrptrが 型の場合、C スタイルの文字列 (の最初の文字) へのポインターとしてchar*扱いptr、その文字列の内容を終端の'\0'null 文字まで (ただし、これは含みません) を出力します。

ポインター値を出力する場合は、次のように変換しvoid*ます。

cout << (void*)ptr << ...

これは、ポインターの値を実際に出力したいと仮定しているためです。ポインターの値は、おそらく 16 進数のメモリ アドレスとして表示されます。タイトルには「ポインタの内容」と書かれていますが、これはメモリアドレス(ポインタオブジェクト自体の内容)になります。代わりに、ポインターが指すデータを印刷したい場合は、質問を更新して、印刷したいものと形式を明確にしてください。

于 2013-02-17T00:30:57.633 に答える
2

cout << ptrptrC 文字列を指しているかのように表示されます。したがって、NUL 文字にヒットすると停止します。たとえば、 を試してみると、 が表示cout << "hello\0world"されるだけhelloです。

その内容を確認したい場合は、代わりにメモリ領域の 16 進ダンプを作成することを検討してください。

于 2013-02-17T00:29:25.417 に答える