You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cython创建含动态数组的结构体并跨函数传递,编译失败求助

你的Cython结构体代码编译失败的问题分析与修复

核心错误点:

  • 语法错误:错误使用HTML转义字符
    代码里的&lt;float *&gt;和&lt;int *&gt;是HTML环境下的小于号转义字符,Cython编译器无法识别,必须替换为Cython标准的强制类型转换语法<float*>和<int*>。

  • 未定义变量引用
    wrap函数中的for i in range(len)里,len是未定义的变量,应该替换为函数传入的参数wind_len。

  • 函数返回类型写法兼容问题
    部分Cython版本对cdef StructNew(int len) -> Struct这种箭头式返回类型支持不好,建议改用传统的cdef Struct StructNew(int len)定义方式。

修正后的完整代码

from libc.stdlib cimport malloc, free

ctypedef struct Struct:
    float* float_array
    int* int_array

cdef Struct StructNew(int len):
    cdef Struct s
    # 修正类型转换语法
    s.float_array = <float*> malloc(len * sizeof(float))
    s.int_array = <int*> malloc(len * sizeof(int))
    for i in range(len):
        s.float_array[i] = i
        s.int_array[i] = i
    return s

cdef wrap(int wind_len):
    cdef Struct s = StructNew(wind_len)
    # 替换未定义的len为传入的wind_len
    for i in range(wind_len):
        print(s.float_array[i])
    # 补充内存释放逻辑,避免内存泄漏
    free(s.float_array)
    free(s.int_array)

额外说明

修正后的代码解决了编译报错的问题,同时添加了free调用释放分配的堆内存,避免运行时出现内存泄漏问题。

内容的提问来源于stack exchange,提问作者Gideon Kogan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:10:15