C++数据结构多链表统计作业报退出码134(SIGABRT)原因求助
exit code 134(SIGABRT)触发原因定位
这类中断是程序访问非法内存、触发内存保护机制时被系统强制终止的信号,结合你写的代码,触发点全部来自以下几处问题:
- 数组越界访问(直接触发SIGABRT的核心原因)
代码中随机元素生成范围是0~50,覆盖共51个整数取值。但定义的计数数组NumbersList[50]、CheckingList[50]长度仅为50,C++定长数组的有效下标范围是0到数组长度减1,也就是这两个数组根本没有预留下标为50的存储位置。当随机生成的element值为50时,代码执行CheckingList[element]、NumbersList[element]这类读写操作时,会直接访问数组边界外的非法内存,触发操作系统内存保护,直接发送SIGABRT终止程序。 - 数组初始化语法完全失效
代码中写的CheckingList[50]={0};不仅没有达到“每处理一条链表前重置去重标记”的目的,本身也是一处越界访问:这行代码的语义是给数组下标为50的位置(本身是非法越界位置)赋值为0,完全没有遍历数组、把0~49所有位置清零的效果。每轮外层循环处理新链表时,上一轮残留的CheckingList标记值会保留,导致后续链表中出现的重复元素被错误判定为“当前链表已存在”,计数逻辑完全失效。 - 循环边界多算1次
节点插入循环写为for(j=0;j<=listsize;j++),实际插入的节点数为listsize+1,会导致每条链表长度在101201范围,和需求要求的100200范围不符。 - 链表实例复用错误
main函数中仅创建了1个linkedlistCreation对象,用户输入的k条独立链表的所有节点都被插入同一个单链表结构中,完全没有实现“为每个链表单独生成”的逻辑要求。
对应修复方向
- 调整两个计数数组的长度为51,完整覆盖0~50的元素下标范围:
int NumbersList[51] = {0}; int CheckingList[51] = {0}; - 替换错误的数组初始化逻辑,每轮外层循环处理新链表前,对CheckingList的所有位置做全量清零,比如通过循环赋值、
fill(CheckingList, CheckingList + 51, 0)的方式实现重置,删除那行无效的CheckingList[50]={0}代码 - 修正节点插入的循环条件为
for(j = 0; j < listsize; j++),匹配要求的链表长度范围 - 每处理一条新链表时,新建独立的
linkedlistCreation实例,不要所有链表共用同一个对象 - 最终筛选output数组时,元素判断阈值要注意边界:至少出现在半数及以上链表中,对应阈值为
NumbersList[i] >= (k + 1) / 2(避免整数除法导致的奇数k场景下阈值偏低的问题),遍历范围覆盖0~50所有可能的元素值,把符合条件的元素存入output数组。
内容的提问来源于stack exchange,提问作者philipvig
相关产品推荐
相关产品推荐

