C语言数组查找Tag值移至首位的移位代码错误排查
C语言数组MRU移动逻辑代码问题修正
原代码存在的问题
- 数组遍历越界:外层循环判断条件为
j<=lines,C语言数组下标从0开始,若数组总长度为lines,合法下标范围是0~lines-1,该条件会访问数组边界外的非法内存。 - 边界场景处理缺失:当匹配到的目标值
tag刚好在数组首位(j=0)时,代码会执行MRU[j-1]即访问MRU[-1],触发非法内存访问错误。 - 移位逻辑顺序错误:原代码将
MRU[0] = tag写在内层移位循环内部,每次移位都会覆盖数组首位的值,导致后续移位时把刚写入的tag又往后复制,最终出现数据重复、原前置元素丢失的问题。 - 冗余无效代码:定义的
temp1变量仅做赋值操作,没有参与任何后续逻辑,属于无效代码;匹配到tag后对k的赋值也和内层循环初始化重复,没有实际作用。
修正后代码
修正逻辑遵循:遍历不越界、匹配后先完成所有元素后移、最后再将目标值写入首位,首位命中时直接跳过移位操作。
if (replacement == 1) { // 遍历数组搜索目标tag int j, k; for(j = 0; j < lines; j++){ // 修正循环边界,移除等号避免越界 if(MRU[j] == tag){ printf("Hit!\n"); hits++; h = 1; // 命中位置不在首位时才需要移位 if (j > 0) { // 从命中位置倒序遍历,将位置前的所有元素依次后移1位 for(k = j; k > 0; k--) { MRU[k] = MRU[k - 1]; } // 所有移位完成后,再把tag放到数组首位 MRU[0] = tag; } break; } } }
内容的提问来源于stack exchange,提问作者A D
相关产品推荐
相关产品推荐

