2010-12-08 10 views
1
CString str("0x1b1be0") 
void* ptr = NULL; 

ここではptr = 0x1b1be0を割り当てたいと思います。これをどのように達成するのですか?アドレスがCStringオブジェクトに格納されているポインタにアドレスを割り当てる方法は?

+0

よく、scanfを使用しますか? – x13n

+2

何をしようとしていますか?あなたがそのポインタで何かをするなら、それはUBである可能性が高いです。 – etarion

+0

"今私は割り当てたい..."なぜこの課題に何か役に立つものがあると思いますか? –

答えて

1

これを試してみてください:

CString str("0x1b1be0"); 
void* ptr = (void *)_tcstoul(str.GetBuffer(), 0, 0); 

そして、これは純粋なCである:

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char *s = "0x1b1be0"; 
    void *p = (void *)strtoul(s, 0, 0); 
    printf("%p", p); 
    return 0; 
} 

Codepad上でそれを試してみてください。

注:このバージョンにはエラーチェックがありません。アイデアを実証するだけです。あなたはそのようなことは非常に疑問である行うに持つ、デバッガなどの非常に低レベルなものを書いている場合を除き

1
#include <sstream> 

std::stringstream s; 
s << "0x1234"; 
void* a; 
s >> std::hex >> a; 
+0

Cstringクラスの代わりに、これをどのように達成できますか?char * cptr = "0x1b1be0 "、ptr = 0x1b1be0となる。 – Suri

+0

おそらく 'sscanf'を使っているかもしれませんが、私は安全な解決法を知らないでしょう(つまり' sizeof(int)== sizeof(int *) 'と仮定しないで)。 – Kos

+2

@Suri:質問をC++とタグ付けしました。 (私はCとC++の質問に同時にタグを付ける人たちも愛していますが、いくつかの答えをした後、彼らは実際にはある言語の答えにしか関心がありませんでしたが、もう1つ...) – Mephane

0

ここにコードがあります。

#include <sstream> 
#include <iostream> 

int main() { 
    void * x; 
    std::stringstream ss; 
    ss << std::hex << "0x1b1be0"; 
    ss >> x; 
    std::cout << x << std::endl; 
} 
0

うーん、...

は、あなたは、ポインタが何を意味するか知っていますか?

あなたのプロセスに専用のポインタがありますか?彼らはほとんどの場合、外で意味を持ちません。

  1. %x書式指定子と例std::sscanfのために使用してintptr_tにあなたの文字列を変換します

    は、あなたの質問に答えるために、あなたは明らかにする必要があります。
  2. ポインタにreinterpret_cast< void* >を割り当てます。
+0

'%x'はおそらく' sizeof(int) 'を読み込むので、64ビットシステムでは4バイト、sizeof(void *)は8バイトになるので、ここでは本当に恐れがあります私たちがいくつかの移植性のない仮定でOKでない限り、私は興味があります。なぜなら、なぜデバッガの他にこれが必要なのか興味があるからです... – Kos

+0

'scanf("%x "、&foo)' _will_write 'sizeof(int)' bytesそれ以上のものはありません)、通常はもっと多くのものが読み込まれます(例えば、「0xC0000005」は10バイトですが、「0xC0000005」は4です)。おそらく、 'printf()'によってnfusedされ、他の方向(メモリから標準出力)で動作します。 – MSalters