2

我正在创建一个 ctype 结构。我有一个外部函数,需要将指向该结构的指针传递给它。ctype 结构中应该有一个 void 指针。

示例函数原型:

ExtFunc(
TestStruct* myVoidStruct
);

其中我的 C 等效结构定义如下:

typedef struct voidStruct
{
    void* voidField;
} voidStruct;

我试图创建这样一个结构,但 void 指针总是被 Python 解释为不是 void 指针。

如果有的话,这有什么影响?这是否意味着外部函数也将结构的这个元素解释为 void 指针以外的东西?

>>> class TestStruct(ctypes.Structure):
    _fields_ = [("voidField", ctypes.c_void_p)]

>>> x = TestStruct()

并且马上, voidField 作为 NoneType 返回

>>> type(x.voidField)
<type 'NoneType'>

但是,我可以在结构之外创建和维持一个 void 指针:

>>> y = ctypes.c_void_p(123)
>>> y
c_void_p(123L)

正如我上面所说,我将我的结构传递给外部函数。当函数完成时,结构元素的类型为“long”,具有关联的值

>>> x.voidField
88145984L
>>> type(x.voidField)
<type 'long'>

为什么现在是 long 类型?它的价值有什么意义?这是指针的内存地址吗?指针指向的内存地址?还是它指向的内存地址的前几个字节的值?

4

2 回答 2

4

并且马上, voidField 作为 NoneType 返回

这只是因为NULL指针被翻译成 Python None...

>>> from ctypes import *
>>> class TestStruct(Structure):
...  _fields_ = [("voidField", c_void_p)]
...
>>> x.voidField = 0
>>> print repr(x.voidField)
None

为什么现在是 long 类型?

一旦您将指针设置为非零值,它将是 Pythonint或 Python long...

>>> x.voidField = 123
>>> print repr(x.voidField)
123

它的价值有什么意义?

它是void *指针指向的地址,即你会从类似...的东西中得到什么

void* ptr = malloc(1000);
printf("%ld\n", (long) ptr);
于 2013-06-28T19:59:44.770 回答
0

C 指针是整数,其中值是所指向事物的内存地址。指针的类型基本上只是了解取消引用时要抓取多少字节的提示。

于 2013-06-28T19:52:24.780 回答