Python ctypes 返回值问题

11 投票
2 回答
12541 浏览
提问于 2025-04-16 18:02

为什么我有这段简单的代码

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

撰写回答