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

内存泄漏排查:仅分配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:38:10