C++棋盘游戏开发中vector触发Segmentation fault,如何修复?
C++棋盘游戏Vector访问导致Segmentation Fault问题修复
我正在完成一个C++棋盘游戏的课程作业,程序持续触发Segmentation fault。我标记了Map::DisplayMap()函数中疑似出错的代码行,但不知道具体修复方法。我了解Segmentation fault是因访问未授权内存导致,但不清楚自己代码中该问题的成因。相关代码如下:
#include <iostream> #include <vector> #include <cstdlib> #include <iomanip> #include <ctime> #include <string> using namespace std; struct Map { vector<vector<char>> board; int DimX, DimY; void CellContent(int DimX, int DimY); void DisplayMap(); int getDimensions(); }; void Map::CellContent(int DimX, int DimY) { char objects[] = {' ', ' ', ' ', ' ', ' ', ' ', 'X', '#', '@', '$'}; int noOfObjects = 10; board.resize(DimY); // Create empty vector for (int i = 0; i < DimY; ++i) { board[i].resize(DimX); } for (int i = 0; i < DimY; ++i) // put random Characters inside vector { for (int j = 0; j < DimX; ++j) { int ObjectNumber = rand() % noOfObjects; board[i][j] = objects[ObjectNumber]; } } } void Map::DisplayMap() { cout << " --__--__--__--__--__--__--__--" << endl; // Header cout << " = Alien, defeat the Zombies! =" << endl; cout << " __--__--__--__--__--__--__--__" << endl; // Each Row for (int i = 0; i < DimY; ++i) { // DisplayMap upper border cout << " "; for (int j = 0; j < DimX; ++j) { cout << "+-"; } cout << "+" << endl; // DisplayMap row number cout << setw(2) << (DimY - i); // DisplayMap cell content for (int j = 0; j < DimX; ++j) { cout << "|" << board[i][j];// <========= The problem starts here, I think. // << " "; // letak content } cout << "|" << endl; } // DisplayMap lower border cout << " "; for (int j = 0; j < DimX; ++j) { cout << "+-"; } cout << "+" << endl; // DisplayMap column number cout << " "; for (int i = 1; i <= DimX; ++i) { int digit; digit = i / 10; if (DimX >= 10) { cout << " "; if (digit == 0) { cout << " "; } else { cout << digit; } } } if (DimX >= 10) { cout << endl << " "; for (int j = 1; j <= DimX; ++j) { cout << " " << (j % 10); } } else { for (int j = 1; j <= DimX; ++j) { cout << " " << (j % 10); } } } int main() { Map Map; Map.DimX = 11; Map.DimY = 5; Map.DisplayMap(); }
问题原因
- 未初始化棋盘向量就访问:
main函数中仅设置了DimX和DimY,但没有调用CellContent()方法初始化board二维向量。此时board是空的,DisplayMap()中访问board[i][j]属于越界访问未分配的内存,直接触发Segmentation fault。 - 参数冗余易混淆:
CellContent方法的参数DimX、DimY与结构体成员重名,虽然当前逻辑能运行,但会优先使用局部参数,增加代码维护难度。
修复方案
1. 先初始化棋盘再显示
在main函数中设置完维度后,调用CellContent()初始化board:
int main() { Map Map; Map.DimX = 11; Map.DimY = 5; Map.CellContent(Map.DimX, Map.DimY); // 新增初始化调用 Map.DisplayMap(); return 0; }
2. 优化CellContent方法(推荐)
移除冗余参数,直接使用结构体自身的DimX和DimY,避免变量名冲突:
// 修改结构体声明 struct Map { vector<vector<char>> board; int DimX, DimY; void CellContent(); // 去掉参数 void DisplayMap(); int getDimensions(); }; // 修改方法实现 void Map::CellContent() { char objects[] = {' ', ' ', ' ', ' ', ' ', ' ', 'X', '#', '@', '$'}; int noOfObjects = 10; board.resize(DimY); for (int i = 0; i < DimY; ++i) { board[i].resize(DimX); } for (int i = 0; i < DimY; ++i) { for (int j = 0; j < DimX; ++j) { int ObjectNumber = rand() % noOfObjects; board[i][j] = objects[ObjectNumber]; } } } // 对应main中的调用改为: Map.CellContent();
3. 添加随机种子(可选)
为了让每次运行生成的棋盘内容不同,在main开头添加随机种子初始化:
srand(time(nullptr));
内容的提问来源于stack exchange,提问作者MOHD FARHAN BIN MOHD FAIRUSHAM
相关产品推荐
相关产品推荐

