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

FCFS调度器项目第二次调用realloc()报invalid next size错误如何解决

问题根因

核心错误出现在动态数组扩容的increase函数中,你对realloc的大小参数计算完全错误:

  • 代码中sizeof(*p)的*p是Process*类型,拿到的是指针本身的大小(64位系统下固定为8字节,32位系统下为4字节),而非当前Process数组的总字节数。
  • 你每次扩容仅申请了「指针大小+1个Process大小」的内存,远小于实际需要的(原有进程数+1)*sizeof(Process)的空间,后续写入新进程数据时会越界破坏堆内存的元数据结构,第二次调用realloc时堆检测到结构损坏就抛出了realloc(): invalid next size错误。

除此之外还有三个潜在风险:

  • realloc没有做错误判断:如果realloc申请内存失败会返回NULL,直接赋值给*p会导致原有内存地址丢失,造成内存泄漏。
  • initProcess存在越界访问风险:当新增的是第一个进程(下标为0)时,访问p[n-1]等价于访问数组下标-1,属于非法内存访问,会触发未定义行为。
  • 初始数组的进程未做初始化:你初始malloc的n个Process的字段默认是垃圾值,如果没有逐个初始化,计算后续进程等待时间时会读取错误值。

修复方案

1. 修复扩容函数increase

void increase(Process **p, size_t *n) {
    // 正确计算扩容后的总内存大小
    size_t new_size = (*n + 1) * sizeof(Process);
    // 用临时变量接收realloc返回值,避免内存泄漏
    Process *temp = realloc(*p, new_size);
    if (temp == NULL) {
        printf("内存扩容失败,无法新增进程\n");
        return;
    }
    *p = temp;
    *n += 1;
}

2. 修复进程初始化函数initProcess

void initProcess(Process p[], size_t n) {
    p[n].id = n;
    p[n].bt = rand() % 15 + 1;
    // 第一个进程等待时间为0,不需要读取前序进程数据
    if (n == 0) {
        p[n].wt = 0;
    } else {
        p[n].wt = p[n-1].bt + p[n-1].wt;
    }
    p[n].tat = p[n].bt + p[n].wt;
}

3. 补充初始数组的初始化逻辑

初始malloc得到n个Process的数组后,需要从下标0到n-1循环调用initProcess初始化每个进程,保证字段值正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:36:01