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

