使用ctypes从Python调用C函数:使用指针时出错
我在Windows8上使用ctypes从Python3.4脚本调用一个C函数。我用cygwin gcc创建了一个DLL。只要我只使用参数和局部变量,C函数就可以正常工作,但是任何带有在函数中定义的指针的引用都会失败,没有错误消息或核心文件,只是一个无声的程序崩溃。例如,以下操作失败:使用ctypes从Python调用C函数:使用指针时出错,python,ctypes,Python,Ctypes,我在Windows8上使用ctypes从Python3.4脚本调用一个C函数。我用cygwin gcc创建了一个DLL。只要我只使用参数和局部变量,C函数就可以正常工作,但是任何带有在函数中定义的指针的引用都会失败,没有错误消息或核心文件,只是一个无声的程序崩溃。例如,以下操作失败: CALC_Z_SER_DLL int calc_z_ser(struct complex_num *q, int *output, int len_q,
CALC_Z_SER_DLL int calc_z_ser(struct complex_num *q, int *output,
int len_q, int maxiter) {
int *malloctest = malloc(sizeof(int));
*malloctest = 42; /* crashes here */
但是,我可以使用指针毫无问题地访问数组参数
在Windows DLL中是否需要使用特殊的指针类型?或者在构建DLL时需要使用的特定于Windows的选项?在C函数的头文件中,我使用了以下声明:
#ifdef BUILDING_CALC_Z_SER_DLL
#define CALC_Z_SER_DLL __declspec(dllexport)
#else
#define CALC_Z_SER_DLL __declspec(dllimport)
#endif
int CALC_Z_SER_DLL calc_z_ser(struct complex_num *q, int *output,
int len_q, int maxiter);
你能详细说明一下吗?也许这是一个糟糕的例子,但在代码中,您根本没有访问参数,而是访问分配的内存。马洛克成功了吗?当被调用的指针方法为空时会发生什么情况,即它也会在没有代码的情况下崩溃吗?@dhke,正如我所说,我可以使用指针访问数组参数,没有问题。但是指针的任何其他用法都会失败,例如,将局部变量的地址传递给被调用的C函数。在本例中,malloc成功,*malloctest导致崩溃。>gcc-GCC4.9版。3@eryksun,gcc 4.9.3不承认-mno cygwin。很明显,它被弃用了,最后被删除了。如果你链接到cygwin1.dll,我不知道它的malloc是如何实现的。msvcrt.dll仅包装Win32堆API。它使用来自的私有堆。一个进程还有一个默认堆,您可以尝试:HeapAllocGetProcessHeap、heap\u GENERATE\u EXCEPTIONS、sizeofint。