You need to enable JavaScript to run this app. C语言pthread线程传递文件名后程序结束报abort错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

C语言pthread线程传递文件名后程序结束报abort错误如何解决

问题原因分析

你遇到的运行结束abort问题核心是栈缓冲区溢出/非法内存访问导致的栈结构被破坏,程序退出时系统检测到栈损坏触发abort,具体有几个问题点:

  • 变量k未初始化也没有做合法校验:
    你在每轮时间片循环中,只有当找到满足条件的进程时才会给k赋值,如果某轮循环没有已到达且未执行完的进程(比如初始时刻所有进程到达时间都大于当前时间、或者进程已经全部执行完),k就是栈上的随机垃圾值,后续执行BT[k]--就会越界访问栈内存,直接破坏栈结构。
  • 硬编码的缓冲区过小存在溢出风险:
    文件名数组fileName仅定义了10字节长度,最多只能存9个字符的文件名,输入文件名稍长就会发生栈溢出;读取文件行的line数组10字节、存储执行序列的PR数组固定100长度,都存在溢出可能。
  • 排序逻辑不完整:
    你按到达时间排序时只交换了AT和BT数组,对应的PT数组没有同步交换,虽然目前不会触发崩溃,但后续如果用到优先级参数就会出错。
修复方案

你可以按以下步骤修改代码:

  1. 给k增加合法校验,处理CPU空闲的情况
    在每轮时间片循环中增加标记位,确认找到有效进程后再操作对应的数组:
for (i=0; i<totalBurst; i++)
{
    small = 3200;
    int found = 0; // 新增标记位
    for (j=0; j<numProcess; j++)
    {
        if ((BT[j] != 0) && (AT[j] <=i) && (BT[j]<small))
        {   
            small = BT[j];
            k = j;
            found = 1; // 标记找到有效进程
        }
    }   
    if (!found) continue; // 没有找到有效进程直接跳过本轮
    BT[k]--;
    PR[i] = k;
}
  1. 放大所有缓冲区长度,避免溢出
    把主函数和SRTF函数里的fileName数组长度改成256,line数组长度改成256;PR数组可以改成动态分配,根据计算得到的totalBurst大小申请内存:
// 读取完所有进程的burst时间后再申请PR数组
int *PR = (int*)malloc(sizeof(int) * totalBurst);
// 程序结束前释放内存
free(PR);
  1. 完善排序逻辑,同步交换PT数组
if(AT[i] > AT[j])
{    
    swap = AT[i];
    AT[i] = AT[j];
    AT[j] = swap; 
    swap = BT[i];
    BT[i] = BT[j];
    BT[j] = swap;
    swap = PT[i]; // 新增PT数组交换
    PT[i] = PT[j];
    PT[j] = swap;
}
  1. 增加fopen失败校验,避免空指针操作
    打开文件后判断fp是否为NULL,为空直接返回错误:
fp = fopen(fileName,"r");
if (fp == NULL) {
    printf("文件打开失败\n");
    return NULL;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 09:45:02