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
相关产品推荐
相关产品推荐

