2012-03-13 38 views
8

Phiên bản ngắn: Làm cách nào để có được địa chỉ mà một con trỏ trỏ đến?Lấy địa chỉ bộ nhớ được trỏ đến bằng một con trỏ ctypes

Phiên bản dài: Tôi đã đăng ký chức năng python làm cuộc gọi lại với thư viện C. Thư viện C mong đợi chữ ký chức năng của void (*p_func)(char stat, char * buf, short buf_len) vì vậy tôi đăng ký một hàm python thích hợp. Khi tôi vào hàm python, tôi muốn biết địa chỉ bộ nhớ được trỏ đến bởi buf. Tôi có thể làm cái này như thế nào?

+1

Sẽ hữu ích nếu bạn đăng một số mã nguồn bằng cách sử dụng các thẻ {}. Cảm ơn. – octopusgrabbus

+1

Tôi đã tự sửa lỗi này với 'ctypes.addressof (buf.contents)' nhưng tôi không thể trả lời câu hỏi của riêng mình. –

+0

Tôi nghĩ rằng bạn đang tìm kiếm "id" của hàm http://docs.python.org/library/functions.html#id Trong [1]: a = 4 Trong [2]: id (a) Out [ 2]: 10019764 –

Trả lời

9

Tôi đã tự khắc phục sự cố này bằng cách đọc tài liệu.

Tôi muốn biết vị trí bộ nhớ của một khối bộ nhớ được thư viện phân bổ. Tôi đã có con trỏ ctypes chỉ vào khối nói. Để lấy địa chỉ bộ nhớ của khối tôi đã sử dụng ctypes.addressof(p_block.contents).

Sự nhầm lẫn nảy sinh xung quanh sự hiểu biết của tôi rằng p_block.contents != p_block.contents, nhưng sau đó tôi nhận ra tất cả các đối tượng p_block.contents có cùng bộ đệm cơ bản. Địa chỉ của bộ đệm cơ bản thu được với ctypes.addressof.

+1

Đó là một chút giống như '& (* p)' trong C trong đó 'p' là một con trỏ. Điều kỳ lạ là ctypes không định nghĩa thuộc tính 'value' cho kiểu con trỏ tùy ý như được trả về bởi hàm' ctypes.POINTER'. Lớp 'ctypes.c_void_p' * có * có thuộc tính' value', nhưng lớp được trả về bởi 'ctypes.POINTER' thì không. Rất kỳ quặc, phản trực giác, và gần như là các chuyên gia thực hiện không đầy đủ. – amn

+1

FYI https://bugs.python.org/issue26565, "Thêm thuộc tính giá trị vào con trỏ không cơ bản": >> Tôi biết một người có thể thực hiện địa chỉ (p.contents), nhưng có một chút không nhất quán rằng c_void_p và c_char_p chứa cùng một thông tin trong thuộc tính giá trị. > Giá trị 'của con trỏ c_char_p hoặc c_wchar_p là một byte hoặc đối tượng str. Vì 'giá trị' sẽ không nhất quán là giá trị địa chỉ, nên tốt hơn nên giới thiệu thuộc tính' as_void' chỉ đọc có thể được triển khai nhất quán cho tất cả các kiểu con trỏ (bao gồm cả con trỏ hàm). – memeplex

Các vấn đề liên quan