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

Windows下GDB调试中途报“Unknown Signal”错误求助

问题排查与修复

首先,你的问题并非内存不足,而是代码中的逻辑错误导致的未定义行为(比如数组越界),具体问题与修复方案如下:

1. 网格扩展逻辑的致命错误

在extendGrid函数处理左边界扩展时,你循环遍历所有行,但始终只修改第一行(gridptr->at(0)),这会导致网格各行的列数不一致:

// 错误代码
for (int i = 0; i < colSize; i++) {
  gridptr->at(0).insert(gridptr->at(0).begin(), 0);
}

正确的做法是修改当前循环对应的行(gridptr->at(i)),确保所有行同步扩展:

// 修复后
for (int i = 0; i < colSize; i++) {
  gridptr->at(i).insert(gridptr->at(i).begin(), 0);
}

这个错误会导致部分行的列数少于其他行,后续访问grid[tailpos[0]][tailpos[1]]时极易触发越界访问,引发程序崩溃。

2. 尾巴移动逻辑错误

updateTail函数的移动逻辑不符合题目规则:当head与tail在对角线方向距离为2时,尾巴会错误地移动两格,而非正确的一格。正确的规则是:当head与tail的行/列差≥2时,尾巴需要向head方向移动一格(包括斜向)。

修复后的updateTail函数:

void updateTail(int headpos[], int tailpos[]) {
  int diffX = headpos[0] - tailpos[0];
  int diffY = headpos[1] - tailpos[1];

  // 仅当行/列差≥2时才移动尾巴
  if (abs(diffX) >= 2 || abs(diffY) >= 2) {
    // 行方向:根据差值正负移动1格
    tailpos[0] += (diffX > 0) ? 1 : (diffX < 0) ? -1 : 0;
    // 列方向同理
    tailpos[1] += (diffY > 0) ? 1 : (diffY < 0) ? -1 : 0;
  }
}

3. 其他优化建议

  • 用std::array<int, 2>代替C风格数组传递坐标,避免数组衰减问题,代码更安全;
  • 将main中的方向判断改为switch语句,可读性更好。

修复后的完整代码

#include <fstream>
#include <iostream>
#include <vector>
#include <stdexcept>
#include <cstdlib>

using namespace std;

void extendGrid(vector<vector<int>>* gridptr, int headpos[], int tailpos[]) {
  int colSize = gridptr->size();
  int rowSize = gridptr->at(0).size();

  // 头部超出上边界
  if (headpos[0] < 0) {
    gridptr->insert(gridptr->begin(), vector<int>(rowSize));
    headpos[0]++;
    tailpos[0]++;
  }

  // 头部超出下边界
  if (headpos[0] >= colSize) {
    gridptr->push_back(vector<int>(rowSize));
  }

  // 头部超出左边界
  if (headpos[1] < 0) {
    for (int i = 0; i < colSize; i++) {
      gridptr->at(i).insert(gridptr->at(i).begin(), 0);
    }
    headpos[1]++;
    tailpos[1]++;
  }

  // 头部超出右边界
  if (headpos[1] >= rowSize) {
    for (int i = 0; i < colSize; i++) {
      gridptr->at(i).push_back(0);
    }
  }
}

void updateTail(int headpos[], int tailpos[]) {
  int diffX = headpos[0] - tailpos[0];
  int diffY = headpos[1] - tailpos[1];

  if (abs(diffX) >= 2 || abs(diffY) >= 2) {
    tailpos[0] += (diffX > 0) ? 1 : (diffX < 0) ? -1 : 0;
    tailpos[1] += (diffY > 0) ? 1 : (diffY < 0) ? -1 : 0;
  }
}

int main() {
  vector<vector<int>> grid = {{1}};
  int headpos[2] = {0, 0};
  int tailpos[2] = {0, 0};

  int linecounter = 0;

  ifstream fs("./test_input.txt");
  // ifstream fs("./adventofcode.com_2022_day_9_input.txt");
  char direction;
  int distance;

  while (fs >> direction >> distance) {
    linecounter++;
    cout << "line " << linecounter << endl;
    cout << direction << distance << endl;

    if (linecounter == 386) {
      cout << "aha!" << endl;
    }

    for (int i = 0; i < distance; i++) {
      switch(direction) {
        case 'U': headpos[0]--; break;
        case 'D': headpos[0]++; break;
        case 'L': headpos[1]--; break;
        case 'R': headpos[1]++; break;
        default: throw runtime_error("Invalid direction!");
      }

      extendGrid(&grid, headpos, tailpos);
      updateTail(headpos, tailpos);
      grid[tailpos[0]][tailpos[1]] = 1;
    }
  }

  int tailcount = 0;
  for (const auto& row : grid) {
    for (int cell : row) {
      if (cell == 1) {
        tailcount++;
      }
    }
  }

  cout << tailcount << endl;
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:51:15