python ctype 字符串指针 32b 与 64b : segmentation fault (core dumped)

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

为什么会这样?

最佳答案

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()

关于python ctype 字符串指针 32b 与 64b : segmentation fault (core dumped),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25784454/

相关文章:

python - df.iloc() 的赋值返回 nan

c - 矩阵乘法无法编译

c++ - Recvfrom 在本地工作,但在执行之间的随机端口上不接收任何内容

c++ - 这是确定性的步调一致吗?

visual-studio-2015 - gacutil.exe 在 Windows 10 中的什么位置?

sql - 在 Windows 7 64 位上找不到提供程序

java - 在 Java/PHP/Python 框架内运行已编译的 C/C++ 代码中的算法?

python - 在 HDF5 C++ api 中使用 GZIP 压缩时,是否默认启用自动分块?

python - 从回文到非回文的字典?

c - Linux 堆碎片