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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:46:06