-1

C++ と関数を試しているときに、aを areinterpret_castに変換しようとしたところ、STATUS_ACCESS_VIOLATION 例外が発生しました。shortstring

   short s = 32767;

   short* s2 = &s;
   string* test4 = reinterpret_cast<string*>(s2);

   cout << "reinterpret_cast: " << *test4 << endl;

私の理解では、アプリケーションのプロセスに割り当てられていないメモリを使用しようとしました。

このような禁止されたメモリ アクセスの試みにどのように注意すればよいでしょうか? 私の短い価値が含まれているこの作品だけを再解釈するにはどうすればよいでしょうか?

4

2 に答える 2

1

shortに変換していませんstring。のアドレスを取得し、そのアドレスshortのメモリに が含まれているかのようにアクセスしようとしていますが、含まれstringていません。

幸いなことに、あなたの場合、これによりランダムなデータが無効なポインターとして解釈されるため、アクセス違反エラーが発生しました。有効な文字列構造のように見える何かがそこにあった場合、あらゆる種類の奇妙なことが起こる可能性があります。

このような禁止されたメモリ アクセスの試みにどのように注意すればよいでしょうか?

関係のない型へのポインター間の変換に使用しないでくださいreinterpret_cast。再解釈された値が有効なオブジェクトを指すことを期待してください。何をしているのかを正確に理解していない限り、まったく使用しないでください。

私の短い価値が含まれているこの作品だけを再解釈するにはどうすればよいでしょうか?

数値を文字列に変換する場合は、文字列ストリームを使用できます。

std::ostringstream stream;
stream << s;
std::cout << "formatted with a stringstream: " << stream.str() << std::endl;

または、C++11 を使用している場合は、数値を文字列に変換する標準関数があります。

std::string string = std::to_string(s);
std::cout << "converted with to_string: " << string << std::endl;
于 2012-04-22T13:10:27.510 に答える
1

キャストは、あるデータ型を別のデータ型に自動的に変換しません。 reinterpret_castは、関連するデータ型を熟知している場合にのみ使用できる、特に強力で危険な操作です。ここでは詳しく説明しませんが、要するに、shortreinterpret_castへのポインターを string へのポインターにキャストすることはできません。

short 値を文字列に変換する必要がある場合は、他のストリームと同様に、さまざまな種類の入力 (short を含む) を使用してそれらを文字列に変換できるstringstreamクラスを確認してください。

于 2012-04-22T13:15:45.800 に答える