2017-12-01 10 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