>>> from ctypes import *
>>> import ctypes.util
>>> libc = CDLL("libc.so.6")
>>> libc.printf("%c\n", 104)
h
2
>>> libc.islower(104) # Works fine
512
>>> libc.islower.restype = c_bool # But when i do this...
>>> libc.islower(104)
False
>>> c_bool(512)
c_bool(True)
个人而言,我认为'h'是小写的。
这是ctypes中的错误,还是我做错了什么?
答案 0 :(得分:7)
restype
不只是告诉Python输出类型,但最重要的是,告诉我们期望的C类型,以及如何编组它。 islower
返回int
,通常为4个字节宽;如果你说它返回一个bool
(通常是1个字节),你就会打破封送代码的期望。
这次你得到了一个不正确的结果(可能是因为你的平台上的返回代码进入了一个寄存器,所以它只是取了它的低8位),在另一个平台上或者另一种类型容易打破堆栈,从而导致进程崩溃。
所以:不要这样做。始终尊重C API类型并在调用后转换。