内存泄漏排查:仅分配2元素空间生成斐波那契至89的C代码异常
问题分析与修复
你的代码里有几个关键问题导致了内存泄漏和运行异常,咱们一步步拆解:
1. 内存分配的核心错误
- 在
main函数中,给pointer分配空间时误用了sizeof(int*),但pointer是指向int的指针,应该分配sizeof(int)的空间——虽然这个错误在部分系统中不会直接崩溃,但会导致内存分配逻辑不严谨。 - 更致命的是:
fib2函数里重新给参数a分配了一块新内存,直接覆盖了main传入的指针地址!这就造成两块独立内存:main里分配的内存从未被使用,fib2里的新内存用完后没有被释放,直接引发内存泄漏。
2. 数组越界访问
你在fib2里只分配了2个int的空间,但循环中却访问a[i]直到i=11(因为i<12),这属于严重的数组越界行为,会破坏堆内存结构,导致控制台输出异常甚至程序崩溃。
3. 偏离“只用2个元素空间”的设计初衷
你的思路是通过持续更新两个元素来生成斐波那契数列,但当前代码却试图用大数组存储所有元素,完全背离了原本的轻量化设计。
修复后的代码
下面是符合你需求的代码:只用2个元素的空间循环更新,直到输出89,同时解决内存泄漏和越界问题:
#include <stdio.h> #include <stdlib.h> void fib2(int* a); int main() { int *pointer; // 分配2个int元素的空间,修正为sizeof(int) pointer = (int*)malloc(2 * sizeof(int)); if (pointer == NULL) { // 添加malloc失败的检查,养成良好编程习惯 perror("malloc failed"); return 1; } // 初始化前两个斐波那契数 pointer[0] = 0; pointer[1] = 1; // 打印前两个数 printf("%d %d ", pointer[0], pointer[1]); // 调用函数生成后续数列直到89 fib2(pointer); // 释放唯一分配的内存块 free(pointer); printf("\n"); return 0; } // 用2个元素的空间循环更新生成斐波那契数列到89 void fib2(int* a) { int next; while (1) { next = a[0] + a[1]; if (next > 89) { // 达到目标值89就停止循环 break; } printf("%d ", next); // 更新两个元素的位置,为下一次计算做准备 a[0] = a[1]; a[1] = next; } }
修复说明
- 移除了
fib2中多余的malloc,直接复用main里分配的2个元素空间,彻底解决内存泄漏问题。 - 改用循环更新
a[0]和a[1]的方式:每次计算新数后,将前一个数移到a[0],新数存入a[1],完美贴合“只用2个元素空间”的设计思路。 - 添加了
malloc失败的检查,避免内存分配失败导致的后续异常。 - 循环终止条件改为判断生成的数是否超过89,确保最终输出刚好到89为止。
内容的提问来源于stack exchange,提问作者Truong
相关产品推荐
相关产品推荐

