【问题标题】:C++ Segmentation fault with no pointers (g++)没有指针的 C++ 分段错误 (g++)
【发布时间】:2016-01-10 15:45:04
【问题描述】:

我在不使用任何指针的情况下遇到分段错误。 (我正在使用 gcc g++ 编译器)

代码(只有我得到错误的函数):

void printBoard(int boardOwn[][10], int boardState[][10],  int boardType[][10])
{

    char ownerOutput[3][2] = { {' ',' '}, { '*','X' }, { 'o','0' } };
    char stateOutput[5][2] = { {' ', ' '}, {'-', '-'}, { '[', ']' }, {'>', '<'}, {'!', '!'} };

    char verDivider = '|';
    std::string horDivider = "---";

    char characters[10] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' , 'I', 'J'};

    std::cout << "\n\n\n\t";
    for (int i = 0; i < 10; i++)
    {
        std::cout << ' ' << characters[i] << "  ";
    }
    std::cout << "\n\n";


    for (int y = 0; y < 10; y++)
    {
        std::cout << ' ' << y + 1 << '\t';

        for (int x0 = 0; x0 < 10; x0++)
        {

            std::cout << stateOutput[boardState[y][x0]][0] << ownerOutput[boardOwn[y][x0]][boardType[y][x0]]<< stateOutput[boardState[y][x0]][1];

            if (x0 != 9)
            {
                std::cout << verDivider;
            }
            else
            {
                std::cout << '\n';
            }
        }

        if (y != 9)
        {
            std::cout << '\t';
            for (int x1 = 0; x1 < 10; x1++)
            {
                std::cout << horDivider;
                if (x1 != 9)
                {
                    std::cout << verDivider;
                }
                else
                {
                    std::cout << '\n';
                }
            }
        }
    }

    std::cout << "\n\n\n";
}

如果我注释掉:

std::cout &lt;&lt; stateOutput[boardState[y][x0]][0] &lt;&lt; ownerOutput[boardOwn[y][x0]][boardType[y][x0]]&lt;&lt; stateOutput[boardState[y][x0]][1]; line 那么程序可以正常工作,但是该行似乎没有任何问题,因为此位置的任何 cout 语句都会导致段错误。 此外,如果 boardOwn、boardState 和 boardType 被声明并用作 2 维 8*8 数组(而不是 10*10)......那么它也可以正常工作。我确实检查了数组是否正确声明。这是我声明它们时的代码:

enum BoardObjectOwn { NONE_OWN, P1_OWN, P2_OWN };
enum BoardObjectStates {NORMAL_STATE, OWNED_STATE, SELECTED_STATE, POTENTIAL_LOCATION_STATE, UNDER_ATK_STATE};
enum BoardObjectsTypes {MAN_TYPE, KINGED_TYPE};

int boardOwn[10][10];
int boardState[10][10];
int boardType[10][10];


for (int y = 0; y < 10; y++) 
{
    for (int x = 10; x < 10; x++) 
    {
        if (y != 4 && y != 5) 
        {
            if (y % 2 == 0) 
            {
                if (x % 2 == 0) 
                {
                    if (y < 5) 
                    {
                        boardOwn[y][x] = P1_OWN;
                        boardState[y][x] = NORMAL_STATE;
                        boardType[y][x] = MAN_TYPE;
                    }
                    else
                    {
                        boardOwn[y][x] = P2_OWN;
                        boardState[y][x] = NORMAL_STATE;
                        boardType[y][x] = MAN_TYPE;
                    }
                }
                else 
                {
                    boardOwn[y][x] = NONE_OWN;
                    boardState[y][x] = NORMAL_STATE;
                    boardType[y][x] = MAN_TYPE;
                }
            }
            else 
            {
                if (x % 2 != 0)
                {
                    if (y < 5)
                    {
                        boardOwn[y][x] = P1_OWN;
                        boardState[y][x] = NORMAL_STATE;
                        boardType[y][x] = MAN_TYPE;
                    }
                    else
                    {
                        boardOwn[y][x] = P2_OWN;
                        boardState[y][x] = NORMAL_STATE;
                        boardType[y][x] = MAN_TYPE;
                    }
                }
                else
                {
                    boardOwn[y][x] = NONE_OWN;
                    boardState[y][x] = NORMAL_STATE;
                    boardType[y][x] = MAN_TYPE;
                }
            }
        }
        else 
        {
            boardOwn[y][x] = NONE_OWN;
            boardState[y][x] = NORMAL_STATE;
            boardType[y][x] = MAN_TYPE;
        }
    }
}

然后当我调用 printBoard 函数时:

printBoard(boardOwn, boardState, boardType);

另外,我使用的是 gcc g++ 编译器,通常不会出现任何错误,但如果我添加 -Wall,则会出现以下错误:

pp
draughts.cpp: In function ‘int main()’:
draughts.cpp:74:16: warning: statement has no effect [-Wunused-value]
    EXIT_SUCCESS;
                ^
draughts.cpp: In function ‘void game()’:
draughts.cpp:209:8: warning: variable ‘XCord’ set but not used [-Wunused-but-set-variable]
    int XCord;
        ^

这些似乎都与我的问题无关。

我从来没有见过这个错误,我真的不知道如何解决它,所以请帮忙。

谢谢。

克莱门

附:如果您需要查看我的更多代码,我一定会发布它。

【问题讨论】:

  • 正在使用指针,你只是不知道它们。数组衰减为指针。
  • 在编写 C++ 时,我可能从不使用 char*char [] 开始。
  • 在 C 中查找空终止符。如果您选择不使用 std::string,这将很有帮助。
  • 所以你说我应该只使用字符串而不是字符数组?
  • 是的!!!!请做。 :)

标签: c++ segmentation-fault


【解决方案1】:

在你的程序中,数组 boardOwn ,boardState,boardType 根本没有初始化。 原因在 for 循环下面,这是多余的。

for (int x = 10; x < 10; x++) 

你用 10 初始化 x 并且条件是 xfor (int x = 0; x < 10; x++) 。

现在您在 printBoard 函数中传递相同的数组。 访问std::cout &lt;&lt; stateOutput[boardState[y][x0]][0] 是分段错误,因为boardState[y][x0] 将具有垃圾值,因为它未初始化。类似地寻找其他数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2021-05-25
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多