Cython编写通用数组内存释放函数遇编译错误求助
Cython编写通用数组内存释放函数遇编译错误求助
看起来你遇到的编译错误是因为对void*类型的指针操作不符合C语言规则导致的,我先把你贴的错误信息列出来,再一步步分析解决:
.\tools.c(17775): error C2069: Cast from "void" to non-void
.\tools.c(17775): error C2036: "void *" : unknown size
问题根源
错误的核心在于void* arr这个参数:在C语言(包括Cython转译生成的C代码)里,void*是无类型指针,编译器不知道它指向的数据的字节大小,所以:
- 你不能直接对
void*做下标访问arr[i]——编译器没法计算每次下标偏移需要跳过多少字节 - 直接在
free(<double*>arr[i])里先操作arr[i]再转换类型,这一步已经触发了编译器的类型检查错误
修复方案
我们只需要先把void*转换成明确的double**类型,再进行后续的下标操作就可以解决问题。修改后的代码如下:
cdef void free_memory(void* arr, int ndim, int rows): cdef int i cdef double** arr_2d # 定义明确类型的局部指针变量 if ndim == 1: free(<double*>arr) elif ndim == 2: # 先将void*转换为double**,赋值给局部变量后再操作 arr_2d = <double**>arr for i in range(rows): free(arr_2d[i]) free(arr_2d) else: raise ValueError("Unsupported number of dimensions (ndim must be 1 or 2).")
为什么这样改能解决问题
- 先把
void* arr转换为double**并赋值给局部变量arr_2d,编译器就明确知道这是指向double*的指针,下标访问arr_2d[i]时能正确计算内存偏移(每次跳过一个double*的大小) - 避免了直接对
void*进行下标操作的非法行为,符合C语言的类型规则
你原来的示例代码:
cdef double** array = <double**> malloc(n * sizeof(double*)) free_memory(array , 2, n)
用修改后的函数就能正常编译运行了。如果之后需要支持其他类型的数组(比如int),可以考虑写针对性的释放函数,或者用Cython的泛型特性来实现更通用的版本。
备注:内容来源于stack exchange,提问作者user27199655
相关产品推荐
相关产品推荐

