2012-03-13 11 views
8

Versione corta: Come posso ottenere l'indirizzo a cui punta un puntatore ctypes?Ottieni l'indirizzo di memoria puntato da un puntatore ctypes

Versione lunga: Ho registrato una funzione python come callback con una libreria C. La libreria C prevede la firma della funzione di void (*p_func)(char stat, char * buf, short buf_len), quindi registro una funzione python appropriata. Quando arrivo alla funzione python, voglio conoscere l'indirizzo di memoria indicato da buf. Come posso fare questo?

+1

Sarebbe di grande aiuto se tu pubblicassi qualche codice sorgente usando i tag {}. Grazie. – octopusgrabbus

+1

Ho risolto il problema con 'ctypes.addressof (buf.contents)' ma non posso ancora rispondere alla mia domanda. –

+0

Penso che tu stia cercando "id" della funzione http://docs.python.org/library/functions.html#id In [1]: a = 4 In [2]: id (a) Out [ 2]: 10019764 –

risposta

9

Ho risolto il problema leggendo la documentazione.

Volevo sapere la posizione di memoria di un blocco di memoria assegnato da una libreria. Ho avuto il puntatore ctypes che puntava a detto blocco. Per ottenere l'indirizzo di memoria del blocco ho usato ctypes.addressof(p_block.contents).

La confusione è sorto intorno alla mia comprensione che p_block.contents != p_block.contents, ma poi ho realizzato che tutti gli oggetti p_block.contents hanno lo stesso buffer sottostante. L'indirizzo del buffer sottostante è ottenuto con ctypes.addressof.

+1

Un po 'come '& (* p)' in C dove 'p' è un puntatore. Ciò che è strano è che i ctype non definiscono un attributo 'value' per il tipo di puntatore arbitrario come restituito dalla funzione' ctypes.POINTER'. La classe 'ctypes.c_void_p' * ha * l'attributo' value', ma la classe restituita da 'ctypes.POINTER' no. Molto strano, controintuitivo e quasi puzza di implementazione incompleta. – amn

+1

FYI https://bugs.python.org/issue26565, "Aggiungi attributo valore ai puntatori non di base": >> So che si può fare addressof (p.contents), ma è un po 'incoerente che c_void_p e c_char_p contengono la stessa informazione nell'attributo value. > Il 'valore' di un puntatore c_char_p o c_wchar_p è un oggetto Python byte o str. Dato che 'value' non sarà costantemente il valore dell'indirizzo, potrebbe essere meglio introdurre un attributo di sola lettura' as_void' che può essere implementato in modo coerente per tutti i tipi di puntatore (inclusi i puntatori di funzione). – memeplex

Problemi correlati