Python ctypes 返回值问题
为什么我有这段简单的代码
void voidFunct() {
printf("voidFunct called!!!\n");
}
我用下面的方式把它编译成一个动态库
gcc -c LSB.c -o LSB.o
gcc -shared -Wl -o libLSB.so.1 LSB.o
然后我在Python解释器中调用这个函数,使用ctypes
>>> from ctypes import *
>>> dll = CDLL("./libLSB.so.1")
>>> return = dll.voidFunct()
voidFunct called!!!
>>> print return
17
为什么一个void
类型的方法返回的值是17
而不是None
或者其他类似的东西呢?谢谢。
2 个回答
7
这属于未定义行为。你在让ctypes去读取一个根本不存在的返回值。它从栈中读取了一些东西,但返回的结果是没有明确规定的。
37
来自文档的内容:
class ctypes.CDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False)这个类的实例代表已经加载的共享库。库中的函数使用标准的C语言调用约定,并且假设返回值是int类型。
简单来说,你把voidFunct()定义成了一个返回int
的函数,而不是返回空(void),所以Python期待它返回一个int
(无论如何,它总是会得到一个值——只是这个值是随机的)。
你可能应该明确地声明返回值类型为None
。
dll.voidFunct.restype = None