2012-03-13 3 views
8

ショートバージョン: ctypesポインタが指すアドレスを取得するにはどうすればよいですか?ctypesポインタが指すメモリアドレスを取得する

ロングバージョン: 私はPython関数をCライブラリを持つコールバックとして登録しました。 Cライブラリは関数シグネチャvoid (*p_func)(char stat, char * buf, short buf_len)を期待しているので、適切なPython関数を登録します。私がPython関数に入るとき、私はbufが指し示すメモリアドレスを知りたいと思います。これどうやってするの?

+1

{}タグを使用してソースコードを投稿した場合は、役立ちます。ありがとう。 – octopusgrabbus

+1

私はこれを 'ctypes.addressof(buf.contents)'で解決しましたが、私自身の質問にはまだ答えられません。 –

+0

あなたは関数の "id"を探していると思うhttp://docs.python.org/library/functions.html#id [1]:a = 4 In [2]:id(a)Out [ 2]:10019764 –

答えて

9

私はドキュメントを読むことでこれを解決しました。

私は、ライブラリによって割り当てられたメモリブロックのメモリ位置を知りたかったのです。私は上記のブロックを指しているctypesポインタを持っていた。ブロックのメモリアドレスを取得するには、ctypes.addressof(p_block.contents)を使用しました。

p_block.contents != p_block.contentsの混乱が起きましたが、すべてのp_block.contentsオブジェクトに同じ基本バッファがあることを認識しました。基になるバッファのアドレスはctypes.addressofで取得されます。

+1

これはCで '&(* p)'と少し似ていますが、 'p'はポインタです。奇妙なことは、ctypesは 'ctypes.POINTER'関数によって返される任意のポインタ型に' value'属性を定義しないということです。 'ctypes.c_void_p'クラス*は' value'属性を持っていますが、 'ctypes.POINTER'によって返されるクラスは返しません。非常に奇妙で、直観に反する、そして不完全な実装のほとんどの匂い。 – amn

+1

FYI https://bugs.python.org/issue26565「非基本的なポインタに値属性を追加する」: >>私はaddressof(p.contents)を行うことができますが、c_void_pとc_char_pには矛盾がありますvalue属性の同じ情報 > c_char_pまたはc_wchar_pポインタの 'value'は、Pythonバイトまたはstrオブジェクトです。 'value'は一貫してアドレス値ではないので、すべてのポインタ型(関数ポインタを含む)に対して一貫して実装できる読み出し専用' as_void'属性を導入するほうが良いかもしれません。 – memeplex

関連する問題