Python 从ctypes访问大内存缓冲区时出现SEGFULT

Python 从ctypes访问大内存缓冲区时出现SEGFULT,python,ctypes,Python,Ctypes,我在访问Python中的内存时遇到“Segmentation fault core dumped”错误,该内存最初是在共享库中分配的 返回内存的函数声明为: extern "C" double *get_sound_data(int desc); extern "C" long long get_sound_data_size(int desc); Python代码是: from ctypes import * cdll.LoadLibrary("libsomelib.so")

我在访问Python中的内存时遇到“Segmentation fault core dumped”错误,该内存最初是在共享库中分配的

返回内存的函数声明为:

    extern "C" double *get_sound_data(int desc);
    extern "C" long long get_sound_data_size(int desc);
Python代码是:

from ctypes import *
cdll.LoadLibrary("libsomelib.so")
_lib = CDLL("libsomelib.so")

size = _lib.get_sound_data_size(desc)
data = _lib.get_sound_data(desc)
data = cast(data, POINTER(c_double))
arr = []
for i in range(size):
    arr.append(data[i])
对于小型缓冲区,如10k项,它可以工作,但当库返回几兆字节时,第一次尝试访问,即Python中的数据[0]

我看过这个页面,看起来很像


我在Python2.7.12和3.5.2中也遇到了同样的错误,操作系统是Linux。

你不能假装默认的返回类型很好,然后尝试将得到的无意义结果转换成它应该是的类型。实际上,Python可能不应该有默认值,但现在更改它已经太晚了。默认情况下,假定C函数返回C int,并且不能保证C int与指针大小相同;现在,可能不是

您需要实际设置argtypes和restype,以便能够通过ctypes安全地使用函数


你不能把一个C int转换成一个指针,然后假设它会很好地工作。您需要实际设置正确的参数和返回类型。谢谢,它很有效!如果函数具有fvoid签名,则argtypes的正确值是多少?@Bord81:,我相信。我得到的“NameError:name”函数没有定义“我将其作为_lib.function,没有重新类型和argtypes,它可以工作。@Bord81 ctypes通常假定c_int,除非另有规定,否则所有参数和返回值都是32位的。最好是具体的。
get_sound_data = _lib.get_sound_data
get_sound_data_size = _lib.get_sound_data_size

get_sound_data.argtypes = (ctypes.c_int,)
get_sound_data.restype = ctypes.POINTER(ctypes.c_double)

get_sound_data_size.argtypes = (ctypes.c_int,)
get_sound_data_size.restype = ctypes.c_longlong

# Now use the functions