分段故障

时间:2011-07-03 22:30:52

标签: c++ segmentation-fault

#include <iostream>
using namespace std;

void initializeMap(int mapSizeX, int mapSizeY, int map[][10])
{
    // Map details:
    // 0 = # (wall)
    // 1 = space (free space)
    // 2 = x (player)

    for(int x = 0; x < mapSizeX; x++)
    {
        map[x][0] = 0;
    }

    for(int y = 0; y < (mapSizeY - 2); y++)
    {
        map[0][y] = 0;

        for(int x = 0; x < (mapSizeX - 2); x++)
        {
            map[x][y] = 1;
        }

        map[mapSizeX][y] = 0;
    }

    for(int x = 0; x < mapSizeX; x++)
    {
        map[x][mapSizeY - 1] = 0;
    }
}

void paintMap(int mapSizeX, int mapSizeY, int map[][10])
{
    for(int y = 0; y < mapSizeY; y++)
    {
        for(int x = 0; x < mapSizeX; x++)
        {   
            switch(map[x][y])
            {
                case 0:
                    cout << "#";
                    break;

                case 1:
                    cout << " ";
                    break;

                case 2:
                    cout << "x";
                    break;

            }

            cout << map[x][y];
        }
        cout << endl;
    }
}

int main()
{
    int mapSizeX = 10;
    int mapSizeY = 10;
    int map[10][10];
    initializeMap(mapSizeX, mapSizeY, map);
    paintMap(mapSizeX, mapSizeY, map);

    cout << endl << endl;

    return 0;
}

我的代码完美编译没有错误但是当我尝试运行它时,它只是说“分段错误”。我做了一些研究,我不明白为什么我得到它因为我根本不使用指针。我该如何解决?我使用g ++编译它并通过在终端输入./main来运行它。

3 个答案:

答案 0 :(得分:4)

map[mapSizeX][y] = 0;

这是非法的。索引的有效值从0mapSizeX - 1

该行应为:

map[mapSizeX][y] = 0;

假设这是所需的输出?

#0#0#0#0#0#0#0#0#0#0
#0 1 1 1 1 1 1 1 1#0
#0 1 1 1 1 1 1 1 1#0
#0 1 1 1 1 1 1 1 1#0
#0 1 1 1 1 1 1 1 1#0
#0 1 1 1 1 1 1 1 1#0
#0 1 1 1 1 1 1 1 1#0
#0 1 1 1 1 1 1 1 1#0
#0 1 1 1 1 1 1 1 1#0
#0#0#0#0#0#0#0#0#0#0

如果是这样,您的initializeMap功能中会出现许多其他错误的错误。而不是:

for(int y = 0; y < (mapSizeY - 2); y++)

for(int x = 0; x < (mapSizeX - 2); x++)

你应该使用

for(int y = 1; y < (mapSizeY - 1); y++)

for(int x = 1; x < (mapSizeX - 1); x++)

分别


顺便说一句,这是一种更简洁的方式来编写initializeMap

template<int mapSizeX, int mapSizeY>
void initializeMap(int (&map)[mapSizeX][mapSizeY])
{
  for( int y = 0; y < mapSizeY; y++ ) {
    for( int x = 0; x < mapSizeX; x++ ) {
      if (x == 0 || x + 1 == mapSizeX || y == 0 || y == mapSizeY)
         map[x][y] = 0;
      else
         map[x][y] = 1;
    }
  }
}

你可以用

来调用它
initializeMap(map);

无需传递大小,编译器会自动计算出来。

答案 1 :(得分:0)

我看起来不够深入,不知道这是否是您的代码唯一的问题,但

map[mapSizeX][y] = 0;

将在数组的边界上面写。

答案 2 :(得分:0)

initializeMap -

的第二个 for 循环中
map[mapSizeX][y] = 0;

mapSizeX为10,矩阵中没有10*y元素。