编译并尝试运行此代码时出现分段错误

时间:2020-01-13 10:34:02

标签: c segmentation-fault

这是我的代码的一部分:

for(i = 0; i < rows; i++)
{
    for(j = 0; j < columns; j++)
    {
        for(k = 0; k < rows - i && k < columns - j; k++)
        {
            if(i + k > rows || j + k > columns) break;
            if(b->board[i + k][j + k] == 1) counter++;
            if(b->board[i + k][j + k] == 2) counter = 0;
            if(counter > max_pd)
            {
                plh = counter;
                jkee = j;
                kkee = k;
            }
        }
        counter = 0;
    }
    if(plh > max_pd)
    {
        max_pd = plh;
        plh = 0;
        for(n = 0; n < 1; n++)
        {
            if(i + kkee > rows || jkee + kkee + 1 > columns) break;
            if(b->board[i + kkee + 1][jkee + kkee + 1] == 0 && b->board[i + kkee][jkee + kkee + 1] != 0) play_pd = jkee + kkee + 1;
        }
    }
    counter = 0;
    plh = 0;
    jkee = 0;
    kkee = 0;
}

尝试在以下行运行此代码时出现分段错误:

if(b->board[i + kkee + 1][jkee + kkee + 1] == 0 && b->board[i + kkee][jkee + kkee + 1] != 0) play_pd = jkee + kkee + 1;

但是,在上面的确切行中,我清楚地指出,如果放入的数字不存在,请中断。

(板子在这样的结构中定义:b-> board [rows [columns])

1 个答案:

答案 0 :(得分:0)

问题在这里:

if(i + kkee > rows || jkee + kkee + 1 > columns) break;
if(b->board[i + kkee + 1][jkee + kkee + 1] == 0 && b->board[i + kkee][jkee + kkee + 1] != 0) play_pd = jkee + kkee + 1;

bord的每一列的索引必须分别为< rows< columns

打破测试应该是

if(i + kkee + 1 >= rows || jkee + kkee + 1 >= columns) break;

这将确保下一条指令不会超出范围使用索引。

您在使用说明上也遇到了同样的问题:

if(i + k > rows || j + k > columns) break;
if(b->board[i + k][j + k] == 1) counter++;
if(b->board[i + k][j + k] == 2) counter = 0;

中断测试应为

if(i + k >= rows || j + k >= columns) break;
相关问题