2012-03-13 117 views
8

簡短版本: 如何獲取ctypes指針指向的地址?獲取由ctypes指針指向的內存地址

長版本: 我已經註冊了一個Python函數作爲一個C庫的回調。 C庫預計函數簽名爲void (*p_func)(char stat, char * buf, short buf_len),所以我註冊了一個合適的python函數。當我進入python函數時,我想知道buf指向的內存地址。我怎樣才能做到這一點?

+1

如果您使用{}標籤發佈了一些源代碼,這將有所幫助。謝謝。 – octopusgrabbus 2012-03-13 15:31:08

+1

我已經用'ctypes.addressof(buf.contents)'修復了這個問題,但是我還不能回答我自己的問題。 – 2012-03-13 15:48:40

+0

我認爲你正在尋找函數的「id」http://docs.python.org/library/functions.html#id In [1]:a = 4 In [2]:id(a)Out [ 2]:10019764 – 2012-03-13 15:43:41

回答

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 2015-10-22 17:43:03

+1

僅供參考https://bugs.python.org/issue26565「將值屬性添加到非基本指針」: >>我知道可以對addressof(p.contents)進行操作,但是c_void_p和c_char_p包含有點不一致值屬性中的相同信息。 > c_char_p或c_wchar_p指針的'value'是一個Python字節或str對象。由於'value'不會始終是地址值,因此最好引入只讀的as_void屬性,該屬性可以針對所有指針類型(包括函數指針)一致地實現。 – memeplex 2016-05-24 21:46:35

相關問題