2012-04-22 9 views
-1

C++とreinterpret_cast関数を試して、shortstringに変換しようとしましたが、STATUS_ACCESS_VIOLATION例外を取得しました。reinterpret_castとSTATUS_ACCESS_VIOLATION

short s = 32767; 

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

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

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

禁止されたメモリアクセスのこのような試行はどうすればわかりますか?私の短期的な価値を含んでいるこの作品だけをどのように再解釈できますか?

+0

可能であれば、 'static_cast'を使用してください。 – ApprenticeHacker

+2

キャストを止める –

答えて

1

shortstringに変換していません。 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; 
1

キャスティングは、あるデータ型を別のデータ型に自動的に変換しません。 reinterpret_castは、特に強力で危険な操作であり、関連するデータ型の親密な知識でのみ使用できます。ここでは詳しく説明しませんが、その長短はreinterpret_castでshortへのポインタを文字列へのポインタにキャストできません。

短い値を文字列に変換する必要がある場合は、stringstreamクラスを見てください。他のストリームはさまざまな種類の入力(短絡を含む)を消費して文字列に変換できます。

関連する問題