8

为什么如果我有这个简单的代码

void voidFunct() {
      printf("voidFunct called!!!\n");
}

我将它编译为动态库

gcc -c LSB.c -o LSB.o 
gcc -shared -Wl -o libLSB.so.1 LSB.o 

我使用 ctypes 从 python 解释器调用函数

>>> from ctypes import *
>>> dll = CDLL("./libLSB.so.1")
>>> return = dll.voidFunct()
voidFunct called!!!
>>> print return
17

为什么从void方法返回的值是17而不是None或相似?谢谢你。

4

2 回答 2

31

从文档:

类 ctypes.CDLL(名称,模式=DEFAULT_MODE,句柄=无,use_errno=False,use_last_error=False)

此类的实例表示已加载的共享库。这些库中的函数使用标准 C 调用约定,并假定返回 int

简而言之,您将 voidFunct() 定义为一个功能返回int,而不是 void,并且 Python 期望它返回一个int(它以某种方式得到,无论如何 - 它只是碰巧是一个随机值)。

您可能应该做的是明确声明返回值类型为None.

dll.voidFunct.restype = None
于 2011-05-20T14:50:07.473 回答
7

那是未定义的行为。您要求 ctypes 读取根本不存在的返回值。它从堆栈中读取一些内容,但返回的内容是不明确的。

于 2011-05-20T14:47:21.827 回答