0

私はCで作業しています。私がやろうとしているのは、オブジェクトを指すアドレスを含むintを返す関数です。次に、受け取ったint(アドレスを含む)を使用して、このアドレスを指すポインターを作成します。

例 :

MyClass* obj = SomeMethodReturningAPointerOfMyClass();
int address = (int) &obj;
return address;

私はそれがこの部分のために働くと思います。私が得る値は-4197276です。(たぶん私は完全に間違っていますか?)

次に、他の部分では、私は次のようなことをしたいと思います:

MyClass* obj = (MyClass*) address;

エラーが発生せずにobjのメソッドにアクセスできないため、これは機能しません。


私はそれを行う方法を見つけました:

MyClass* obj = SomeMethodReturningAPointerOfMyClass();
machine->registers[2] = (int)obj;

次に、私が行った整数を受け取る他の方法で:

MyClass* obj = (MyClass*)address;

私はobjに完全に取り組むことができます!それほどきれいではないかもしれませんが、それはそれが使用されているもののために仕事をするはずです!

回答に時間を割いてくださった皆様、ありがとうございました!

4

5 に答える 5

6

まず、これをしないでください。pointer が指すオブジェクトではなく、pointer のアドレスを取得しています。はすでにそのアドレスと同じです。スタック上の値になり(あなたの場合は)、関数が戻ると無効になります。objobj&obj0xFFBFF464

第二に、これをしないでください。Anintは、メモリ アドレスの C または C++ の型ではありません。ポインターは型であり、既に 1 つ持っています。

intと同じではありませんMyClass *。実際、64 ビット システム (最近のほとんどの PC を含む) では、ポインターを整数にキャストすると、ポインターの値が半分になり、結果は無効になります。

関数でオブジェクトのアドレスを返す場合は、ポインターを返します。

MyClass *GetAnObject(void) {
    MyClass *result = ...;
    return result;
}

ポインターを整数に変換する必要は決してありません (それが有効な場合もありますが、C の初心者にとっては、完全な禁止の方が理解しやすいです。これらのエッジ ケースは、この質問の範囲を超えています)。

于 2011-07-17T00:05:37.850 に答える
1

どうやら、クラスを使用しているため、C ではなく C++ で作業している可能性があります。

なぜ実際にオブジェクトポインタを int に格納したいのだろうか?

あなたの質問に関して: プラットフォームによっては、(オブジェクト) ポインターが int に収まらない場合があります。ポインターを int にキャストする場合は、単にポインター値を切り捨てることができます。ここで、後でキャストバックすると、ポインタは完全ではなく、メモリ内の未確定の場所を指します。それは問題を引き起こす可能性があります。

言い換えれば、これをしないでください。失敗する可能性が非常に高いだけでなく、多くの問題を引き起こす可能性さえあります。

于 2011-07-17T00:09:37.913 に答える
0

まず、ポインタは 32 ビット幅unsigned longであるため、 の代わりに型を使用する必要がありますint(少なくとも 32 ビット アーキテクチャでは、unsigned long long64 ビットに対応したい場合に使用します)。

次に、address変数に格納するのは aMyClass*ではなく aです。代入時に使用するobj のアドレスMyClass**を格納するためです (そして、既に type です) 。&objaddressobjMyClass*

したがって、ポインタを直接保存するか、MyClass*のポインタMyClass*、つまり aを保存するMyClass**場合は、影響を与えるときに書いた「&」のバランスをとるために、「*」をもう 1 つ使用して 2 回間接的にする必要がありますaddress

MyClass* obj = * ((MyClass*)address);
于 2011-07-17T00:05:07.450 に答える
0

&objポインターobjが格納されているアドレスを返しますが、これは必要なものではありません。本当の答えはさらに簡単です。

void *obj = SomeMethodReturningAPointerOfMyClass();
return (int) address;

intシステム上のポインターと同じサイズでない場合、これは壊れることに注意してください。void *これを、intptr_t、またはとして渡すことができlongます。

于 2011-07-17T00:05:30.130 に答える
0

システムによっては、int適切な選択ではない場合があります。本当にポインタを整数値として渡す必要がある場合uintptr_tは、ポインタと同じ大きさであることが常に保証されている which を使用する必要があります。

また、&objおそらくあなたが望むものではありません。私はあなたが意味したと思いますobj

于 2011-07-17T00:06:18.803 に答える