python ctype字符串指针32b vs 64b:分段错误(核心转储)

时间:2014-09-11 09:58:40

标签: python c 64-bit ctypes 32-bit

我有一个共享库,其中包含此功能:

char * LibVers()
{
    return " LibVers 2.03";
}

我使用ctypes包装所述共享库,并且定义了一个属性如下:

@property
def lib_vers(self):
    """Get shared library version information.

    :return: The shared library version string.
    :rtype: String
    """
    return c_char_p(self.lib.LibVers()).value

在32b机器(Fedora 16)上,这段代码运行正常。但是,在64b机器(CentOS 7)上这个代码分段错误(核心转储)。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

ctypes模块假定返回类型是c_int。如果没有,您必须自己提供返回类型并进行一些转换。大多数情况下,在32位上,这可以很好,但在64,你丢失指针的一些部分,从而使它无效。我将代码更改为以下内容,现在可以按预期工作。

@property
def lib_vers(self):
    """Get shared library version information.

    :return: The shared library version string.
    :rtype: String
    """
    if self.lib.LibVers.argtypes is None:
        self.lib.LibVers.restype = c_char_p
        self.lib.LibVers.argtypes = []
    return self.lib.LibVers()