c++控制台程序接收到SIGSEGV信号,出现分段故障



我试图使用指针的多维数组,这是我的地图,所以在最后的代码我可以使用指针,而不是使碰撞为每个地图。不幸的是,在绘制地图后,当我按箭头移动时,程序崩溃了。调试器只告诉我标题

中的内容

这是其中一个地图:

char *map2[15] = {      
"###^######^###",      
"#L           #",
"^S           #",
"#S           #",
"#    K       #",
"###########  #",
"#G           #",
"#       #### #",
"#       #M   #",
"# @     #    #",
"## ########^##"};

这是开始:

        mainmap = false;
        x = 2;
        game.showing_different_maps(15, map2);    // (y, somemap)

显示地图和移动:

void Game::showing_different_maps(int y, char **somemap)
{
bool differentmap = true;
while (differentmap)
{
    system("cls");
    for(int i = 0; i < y; i++)  // i < map2[y][]
    {
        cout << somemap[i] << endl; // drawing a map !THIS CAUSES CRASH!
    }
    system("pause>nul");       
    if(GetAsyncKeyState(VK_UP))  
    {
        mapki.move(-1, 0);
    }
    if(GetAsyncKeyState(VK_DOWN))
    {
        mapki.move(1, 0);
    }
    if(GetAsyncKeyState(VK_RIGHT))
    {
        mapki.move(0, 1);
    }
    if(GetAsyncKeyState(VK_LEFT))
    {
        mapki.move(0, -1);
    }
}

}

脚本处理冲突:

void Maps::move(int V, int H)
{
int y2 = y + V;
int x2 = x + H;
if(map2[y][x2] == ' ' 
|| map2[y][x2] == 'K'
|| map2[y][x2] == 'W')
{
    map2[y][x] = ' ';
    x += H;
    map2[y][x] = '@';
}
if(map2[y2][x] == ' '
|| map2[y2][x] == 'K'
|| map2[y2][x] == 'W')
{
    map2[y][x] = ' ';
    y += V;
    map2[y][x] = '@';
}                       

}

我想写到处somemap[][],而不是map2[][],但我不能检查它是否有效,因为"程序收到信号SIGSEGV,分割故障。"崩溃。

这里的错误是由于指针数组被声明为大小为15,但只有11个初始化元素。这意味着最后4个初始化为NULL。事实上,你对map2的声明相当于这个:

char *map2[15] = {      
"###^######^###",      
"#L           #",
"^S           #",
"#S           #",
"#    K       #",
"###########  #",
"#G           #",
"#       #### #",
"#       #M   #",
"# @     #    #",
"## ########^##",
NULL, NULL, NULL, NULL};
单独使用

是无害的,但您稍后会使用:

game.showing_different_maps(15, map2);    // (y, somemap)

所以你结束传递空字符指针给cout <<所以SIGSEGV。

你至少应该传递初始化的数组大小,这里是11而不是15:

game.showing_different_maps(11, map2);    // (y, somemap)

但是我怀疑你以后会在move中遇到问题,因为你应该测试0 <= y+V <0 <= x+H <HMAX(这里VMAX>

最新更新