我正在尝试在Python中创建具有特殊类型的缓冲区,以将其发送给包装有CFFI的C函数。
在C语言中,我有类似以下内容:
typedef unsigned char UINT8;
typedef UINT8* PUINT8;
然后,在Python中,以上行在中ffi.cdef()
,我的缓冲区实例化代码如下所示:
nb_buffer = 8
buffer_size = 42
buffers = ffi.new( "PUINT8[]", nb_buffer )
for i in range( nb_buffer ):
tmp_buffer = ffi.buffer( ffi.new( "UINT8[]", 1 ), buffer_size )
buffers[ i ] = ffi.cast( "PUINT8", ffi.from_buffer( tmp_buffer ) )
c.function( buffers )
C函数接收一个UINT8 **。
而且...在C函数中,最后以分段错误结束。
所以我用print buffers[ i ]
后ffi.cast
:
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
我想念什么?缓冲区一被覆盖就被垃圾回收tmp_buffer
吗?
怎么样:
buffers = ffi.new( "PUINT8[]", nb_buffer )
keepalive = []
for i in range( nb_buffer ):
p = ffi.new("UINT8[]", buffer_size)
keepalive.append(p)
buffers[i] = p
c.function( buffers )
# keepalive stays alive at least until here
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句