【问题标题】:python ctype string pointer 32b vs 64b: segmentation fault (core dumped)python ctype string pointer 32b vs 64b:分段错误(核心转储)
【发布时间】:2014-09-11 09:58:40
【问题描述】:

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

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)上,此代码分段错误(核心转储)。

为什么会这样?

【问题讨论】:

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


    【解决方案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()
    

    【讨论】:

    • 您可以使用.restype = c_char_p 并删除演员表。
    • @MarkTolonen:这更优雅。谢谢。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2020-04-09
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多