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

