我有一个简单的c函数,它返回一个字节数组和数组长度:
// base58.h
/* Return type for Decode */
struct Decode_return {
void* r0;
int r1;
};
// Decode decodes a modified base58 string to a byte slice, using BTCAlphabet
extern struct Decode_return Decode(char* p0);
我试图这样从python调用此c函数:
// base58.py
from ctypes import *
base58 = CDLL('./base58.so')
class DecodeResponse(Structure):
_fields_ = [
("r0", c_void_p),
("r1", c_int),
]
base58.Decode.restype = DecodeResponse
expect = bytes.fromhex("61")
print(expect.decode("utf-8"))
res = base58.Decode(c_char_p("2g".encode('utf-8')))
length = c_int(res.r1).value
print(length)
ArrayType = c_byte*(length)
pa = cast(c_void_p(res.r1), POINTER(ArrayType))
print(pa.contents[:])
运行此命令时出现段错误。为什么pa.contents无法寻址?
$ python3 base58.py
a
1
[1] 21864 segmentation fault (core dumped) python3 base58.py
答案 0 :(得分:1)
如果我正确地理解了这一点,则会将int转换为指针。
pa = cast(c_void_p(res.r1), POINTER(ArrayType))
我猜您想将r1
替换为r0
。我建议使用更好的命名方案。