2017-12-01 7 views
-4
int qs = 465; 
std::ostringstream os; 
os << &qs; 
QString tt = QString::fromStdString(os.str()); 
qDebug() << &qs; // output: 0x28fda8 
qDebug() << tt; // output: "0x28fda8" 
int *pp = tt; // how can i do this? 

は、私はそれが愚かだ知っているが、私はあなたがいけないこの文字列を住所に変換するにはどうすればよいですか?

+2

基本的にはちょうどあなたがそれを行う方法を知っています、整数にあなたの文字列を変換する必要がありますか? – Stefan

+1

'QString'と' int * 'は関連していないので、この変換は意味を持ちません(可能ですが)。これは実際にXY問題のようです。実際に達成しようとしていることを述べるべきです。文字列に格納された 'qs'にアドレスを実際のポインタに変換しようとしていますか? – VTT

+0

'int * pp = tt;'何をしたいですか? 'tt'は' QString'で 'int *'には入りません。あなたは 'tt'の中のあるサイズのチャンクをつかんで' pp'に格納することができます。 'pp'が' tt'を指すようにすることもできます。問題は、実際に存在するオブジェクト(および既存のオブジェクトの背後にあるオブジェクト)を正しいタイプのオブジェクトのみを指すことが許可されているため、両方とも未定義の動作です。 'void * pp = &tt;'を実行すると、UBなしで 'pp'に' tt'のアドレスだけを格納することができます。 – nwp

答えて

3

をしようとします。しかし、あなたが本当に必要ならば、あなたは住所の価値を捕らえて、それをint*にキャストできます。本当の厄介な方法は、次のようになります。

#include <iostream> 
#include <sstream> 
#include <cstdint> 

int main() { 
    int qs = 465; 
    std::stringstream ss; 
    ss << &qs; 
    std::uintptr_t temp; 
    ss >> std::hex >> temp; 
    int* pp = reinterpret_cast<int*>(temp); 
} 
+0

これは文字列を 'int *'に変換しません。 – nwp

+0

@nwp実際にそれは –

+0

@МишаковМаксимあなたは正しい、私はそれを逃した。 'temp 'の迂回路は残念ですが、完全に有効です。 – nwp

-1

おかげロン

int qs = 465; 
std::ostringstream os; 
os << &qs; 
QString tt = QString::fromStdString(os.str()); 
qDebug() << &qs; // output: 0x28fda8 
qDebug() << tt; // output: "0x28fda8" 
bool *r; 
int* pp = reinterpret_cast<int*>(tt.toInt(r, 16)); 
qDebug() << *pp; // output: 465 
+0

'int'は必ずしもデータポインタを表現するのに十分な大きさではありません。 – user2079303

関連する問題