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

ARM汇编调用calloc/free报错free(): invalid next size (fast)求助

问题分析与修复

核心错误:内存分配大小严重不足

free(): invalid next size (fast) 是堆结构被破坏的典型表现,根源是你给calloc传递的分配参数错误,导致后续写入越界覆盖了堆的元数据。

具体看代码逻辑:

  • 你计算num_bits = width * 32 * height,这是实际要操作的bit总数,但在initialize循环里,你把每个bit对应成一个int存储(str w0, [dummy, w1, uxtw],其中w1 = i << 2,每个元素占4字节),所以实际需要的内存大小是 num_bits * 4 字节。
  • 但调用calloc时,你传递的是w0 = size = height * width、w1=4,也就是只分配了 height * width *4 字节——这只有实际需要的1/32,必然导致后续循环写入时越界,破坏堆的管理结构,最终触发free报错。

具体修复步骤

1. 修正calloc的分配参数

把calloc的第一个参数改成num_bits,匹配实际需要的元素数量:

// 原错误代码
// mov w0, size
// mov w1, #4    // w1 = 4
// bl calloc

// 修正后
mov w0, num_bits  // 要分配的int元素数量为num_bits
mov w1, #4        // 每个int占4字节
bl calloc

2. 修复栈恢复指令错误

在life_return标签下,你错误地使用stp指令恢复栈,应该用ldp:

life_return:
    // 原错误:stp x27, x28, [sp], #16
    ldp x27, x28, [sp], #16
    ldp x25, x26, [sp], #16
    ldp x23, x24, [sp], #16
    ldp x21, x22, [sp], #16
    ldp x19, x20, [sp], #16
    ldp x29, x30, [sp], #16
    ret

3. 修复copy_values中的返回值读取错误

在copy_values_loop里,你错误地从w7读取get_bit的返回值,但get_bit的返回值存在w0中,这段错误会导致写入无效数据:

// 原错误代码
// mov w0, w7  // moves the result from get_bit into w7
// mov x0, original
// mov w1, num_bits
// mov w2, i
// mov w3, w7
// bl set_bit

// 修正后
mov w3, w0      // get_bit的返回值在w0,直接使用该值
mov x0, original
mov w1, num_bits
mov w2, i
bl set_bit

额外优化建议

  • 可以把num_bits的计算改成mul w7, width, height; lsl num_bits, w7, #5,逻辑更直观。
  • 处理边界bit时(比如i=0的左邻居、边缘行的上下邻居),get_bit需要添加越界判断并返回0,否则会读取数组外的垃圾值,影响生命游戏的计算结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:47:49