Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ctypes从Python调用C函数:使用指针时出错_Python_Ctypes - Fatal编程技术网

使用ctypes从Python调用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,

我在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, 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。