假设我在名为libmylib.so
的C库中有以下代码:
static char mystr[9];
/* somewhere else this array is populated with a value 8 bytes or less */
const char *
get_mystr (void)
{
return mystr;
}
从Python解释器,我调用以下
from ctypes import *
mylib = CDLL('libmylib.so')
加载库。现在,我将变量设置为mystr
x = mylib.get_mystr()
如果我尝试检查x
的值或其任何属性,我会遇到分段错误。在提示符下键入TAB
后查看哪些字段/功能可用会导致段错误,甚至使用x.
。
发生了什么事?
编辑:如果我检查x
本身,我会得到一个内存地址,如预期的那样。如果我尝试检查x.value
或查看可用字段,则会崩溃。
编辑2:我尝试检查static
声明是否是我的问题的根源,但如果没有它,它似乎表现相同。
答案 0 :(得分:1)
@eryksun指出C函数的restype
默认为int
并被解析为Python整数。
通过调用mylib.get_mystr.restype = c_char_p
,它现在可以正确解析为可以正确解码的bytes
对象。