Python 双指针

4 投票
4 回答
13571 浏览
提问于 2025-04-15 11:25

我正在尝试从一个指向浮点数组的指针中获取值,但在Python中返回的是c_void_p。

这是C语言的代码

double v;
const void *data;  
pa_stream_peek(s, &data, &length);  
v = ((const float*) data)[length / sizeof(float) -1];

这是到目前为止的Python代码

import ctypes
null_ptr = ctypes.c_void_p()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length)) 

问题在于null_ptr有一个整数值(内存地址?),但没有办法读取这个数组?!

4 个回答

0

当你传递指针参数时,如果不使用ctypes.pointer或ctypes.byref,这些参数的内容就会被设置为内存地址的整数值(也就是指针的位)。为了正确传递这些参数,应该使用byref(或者pointer,不过byref的开销更小):

data = ctypes.pointer(ctypes.c_float())
nbytes = ctypes.c_sizeof()
pa_stream_peek(s, byref(data), byref(nbytes))
nfloats = nbytes.value / ctypes.sizeof(c_float)
v = data[nfloats - 1]
1

如果你想用ctypes来模仿你的C代码,我建议你可以这样做(不过我有点生疏了,这个方法还没测试过):

vdata = ctypes.c_void_p()
length = ctypes.c_ulong(0)
pa_stream_peek(stream, ctypes.byref(vdata), ctypes.byref(length))
fdata = ctypes.cast(vdata, POINTER(float))
3

我的ctypes有点生疏了,但我觉得你应该用POINTER(c_float)而不是c_void_p。

所以试试这个:

null_ptr = POINTER(c_float)()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
null_ptr[0]
null_ptr[5] # etc

撰写回答