WindowsError:异常:使用ctypes从Python调用C dll时读取0xXXXXXXXX错误的访问冲突

WindowsError:异常:使用ctypes从Python调用C dll时读取0xXXXXXXXX错误的访问冲突,python,c,ctypes,Python,C,Ctypes,我有一些c代码如下。返回值是指向动态int数组的指针 __declspec(dllexport) int32_t* foo(const alg_real_t* x, int32_t xlen) { .... result = (int32_t*)malloc( n * sizeof(int32_t)); .... return result; } 我将其编译为dll,下面是我在python中调用该函数的代码: E = cdll.LoadLibrary('mydll.dll') E.foo

我有一些c代码如下。返回值是指向动态int数组的指针

__declspec(dllexport) int32_t* foo(const alg_real_t* x, int32_t xlen)
{

....
result = (int32_t*)malloc( n * sizeof(int32_t));

....
return result;

}
我将其编译为dll,下面是我在python中调用该函数的代码:

E = cdll.LoadLibrary('mydll.dll')
E.foo.restype  =  POINTER(c_int)
E.foo.argtypes = [POINTER(c_int),c_int]

s = (c_int * len(mydata))(*mydata) # mydata is a python list

Result = E.foo(s,len(mydata))
当我运行代码时,经常会收到错误消息: “WindowsError:异常:访问冲突读取0xXXXXXX”。然而,有时程序运行时没有任何错误


有人能帮我吗?谢谢

什么是真实的?在类型名称中,对我来说
real
意味着
双精度浮点。非常感谢,这解决了我的难题!我将python代码更改为:s=(c_double*len(ppg_data))(*ppg_data),它的工作方式很有魅力。a
double
是64位的,因此函数试图读取的字节数是在
c_int
数组中分配的字节数的两倍。如果读取数组之外的内容不会引起访问冲突,这意味着它位于更大的已分配内存块中,这可能导致难以诊断错误。在问题的直接来源处获取访问冲突是最好的调试方案。什么是
alg\u real\t
?在类型名称中,对我来说
real
意味着
双精度浮点。非常感谢,这解决了我的难题!我将python代码更改为:s=(c_double*len(ppg_data))(*ppg_data),它的工作方式很有魅力。a
double
是64位的,因此函数试图读取的字节数是在
c_int
数组中分配的字节数的两倍。如果读取数组之外的内容不会引起访问冲突,这意味着它位于更大的已分配内存块中,这可能导致难以诊断错误。在问题的直接来源处获取访问冲突是最好的调试方案。什么是
alg\u real\t
?在类型名称中,对我来说
real
意味着
双精度浮点。非常感谢,这解决了我的难题!我将python代码更改为:s=(c_double*len(ppg_data))(*ppg_data),它的工作方式很有魅力。a
double
是64位的,因此函数试图读取的字节数是在
c_int
数组中分配的字节数的两倍。如果读取数组之外的内容不会引起访问冲突,这意味着它位于更大的已分配内存块中,这可能导致难以诊断错误。在问题的直接来源处获取访问冲突是最好的调试方案。