gpt4 book ai didi

python - ctypes 中的 LP_* 指针和 *_p 指针有什么区别? (以及与结构的奇怪交互)

转载 作者:太空狗 更新时间:2023-10-29 20:54:52 26 4
gpt4 key购买 nike

我无法理解 Python ctypes 中 LP_*(例如 LP_c_char)和 *_p(例如 c_char_p)指针之间的区别。是否有区分它们的文档?

我读到的关于 *_p 指针的少量内容表明它们更好(以某种未指定的方式),但是当我尝试将它们用作结构字段时,我得到了奇怪的行为。例如,我可以创建一个带有 LP_c_char 指针字段的结构:

import ctypes
char = ctypes.c_char('a')
class LP_Struct(ctypes.Structure):
_fields_ = [('ptr', ctypes.POINTER(ctypes.c_char))]

struct = LP_Struct(ctypes.pointer(char))
print type(struct.ptr)

结果指针是:

<class 'ctypes.LP_c_char'> 

但是当我创建一个带有 c_char_p 指针字段的结构时:

class Struct_p(ctypes.Structure):

_fields_ = [('ptr', ctypes.c_char_p)]

p = ctypes.pointer(char)
struct = Struct_p(ctypes.cast(p, ctypes.c_char_p))
print type(struct.ptr)

生成的“ptr”字段是

<type 'str'>

换句话说,指针在进程的某处被取消引用。

最佳答案

http://docs.python.org/library/ctypes.html#ctypes.c_char_p

Represents the C char * datatype when it points to a zero-terminated string. For a general character pointer that may also point to binary data, POINTER(c_char) must be used.

c_char_p 被映射到 Python 的 str 类型,因为它假设您指的是一个字符串,这通常是您使用 char * 时的情况 在 C 中。LP_c_char 没有这样的假设。

Fundamental data types, when returned as foreign function call results, or, for example, by retrieving structure field members or array items, are transparently converted to native Python types. In other words, if a foreign function has a restype of c_char_p, you will always receive a Python string, not a c_char_p instance.

关于python - ctypes 中的 LP_* 指针和 *_p 指针有什么区别? (以及与结构的奇怪交互),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6697065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com