使用ctypes时,使用islower的结果不正确

时间:2014-07-05 21:54:37

标签: python c ctypes

>>> 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中的错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:7)

restype不只是告诉Python输出类型,但最重要的是,告诉我们期望的C类型,以及如何编组它。 islower返回int,通常为4个字节宽;如果你说它返回一个bool(通常是1个字节),你就会打破封送代码的期望。

这次你得到了一个不正确的结果(可能是因为你的平台上的返回代码进入了一个寄存器,所以它只是取了它的低8位),在另一个平台上或者另一种类型容易打破堆栈,从而导致进程崩溃。

所以:不要这样做。始终尊重C API类型并在调用后转换