You need to enable JavaScript to run this app. C语言递归实现FFT时出现double*类型赋值double的编译报错
优惠活动
大模型
产品
解决方案
定价
更多

C语言递归实现FFT时出现double*类型赋值double的编译报错

编译报错的直接原因

你定义的fft函数返回值是单个double类型的标量,但e、d是用来存子序列变换结果的double*数组指针,两种类型无法直接赋值,自然会抛出类型不兼容的错误。递归FFT的每一层调用,返回的都是和输入长度相等的数组,不是单个值,所以首先要把函数的返回值类型从double改成对应数组的指针类型。

其余会导致运行崩溃、结果错误的实现问题
  • 递归逻辑不闭环:当前lenXH == 1的分支直接返回X[0]的单值,就算调整了返回值类型,这个分支也没有在堆上申请长度为1的数组存放结果,后续递归访问时会直接触发野指针崩溃。
  • 内存申请的长度计算存在多处错误:
    • 给e、d提前申请的(lenXH/2 - 1)*sizeof(double)的内存完全无效,后续递归调用fft时,函数会自行分配返回结果的内存,提前申请的这部分空间从未被赋值,直接造成内存泄漏。
    • 最终结果数组Y只申请了lenXH-1个元素的空间,比实际需要的长度少1,后续写入蝶形计算结果时会直接发生堆内存越界。
  • 蝶形运算公式错误:基2时域抽选FFT的标准蝶形逻辑为,上半段结果是偶子序列结果加旋转因子乘奇子序列结果,下半段结果是偶子序列结果减旋转因子乘奇子序列结果。当前代码里两个分支都使用了加号,会导致输出的后半段和前半段完全一致,无法得到正确的频谱结果。
  • 循环边界设置错误:当前蝶形运算循环仅执行到k < lenXH/2 -1,刚好漏掉了最后一组蝶形的计算,结果数组最后两个元素会保留堆内存的随机值,没有被正确赋值。
  • 旋转因子类型设计错误:FFT的旋转因子是带虚部的复数,当前代码用单个double标量存储旋转因子,无法实现复数乘法运算,就算程序能正常运行,输出结果也完全不符合预期。
  • 入参类型不匹配:拆分得到的Xeven、Xodd是double类型的数组,但fft函数的入参定义为int* X,就算编译通过,按int*的规则解析double类型的内存,读取到的数值会完全错误。
  • 缺少内存回收逻辑:所有通过malloc申请的数组内存,在函数使用完成后从未执行free回收,递归层级越深,内存泄漏的问题越严重。
核心修正方向
  • 统一函数的入参、返回值类型,保证数组传递时类型完全匹配,避免指针强转带来的内存解析错误。
  • 将Y数组的申请长度调整为和输入长度一致,删除无效的预分配内存,在递归终止的单元素分支中,正确申请长度为1的数组存放结果再返回。
  • 修正蝶形运算的公式,将下半部分的加号改为减号,把循环边界调整为遍历全部lenXH/2个蝶形对,避免漏算最后一组结果。
  • 针对复数运算的需求,要么使用C标准库的复数类型存储旋转因子和变换结果,要么单独拆分实部、虚部两个数组,手动实现复数乘法运算。
  • 每一层递归计算完成、不再引用子序列返回的内存后,及时调用free回收对应堆内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 23:45:05