PTA提交一个用C语言写的程序 出现段错误,帮忙看看是哪的问题。谢谢

#include

int m, n;

int main()
{
int h_l[10];
int i, j, pos_i = 0, pos_j = 0;
int h_i = 0, len = 0;
while (1)
{
int L[10][10];
int min = 65535;
if ((scanf("%d %d", &m, &n)) == 2) //输入数据
{
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if ((scanf("%d", &L[i][j])) == 1)
;
else
break;
}
}
}
else
break;

    if (m == 0 && n == 0)
        break;

    for (i = 0; i < m; i++)
    {
        for ( j = 0; j < n; j++)
        {
            if (L[i][j]<min)
            {
                min = L[i][j];
                pos_i = i;
                pos_j = j;
            }
        }
        if (min == 0)
            break;
    }
    len++;
    h_l[h_i] = pos_i;
    h_l[h_i + 1] = pos_j;
}

for (int k = 0; k < len; k = k + 2)
    printf("%d %d\n", h_l[k] + 1, h_l[k + 1] + 1);

return 0;

}

m和n会不会大于10了,那样超过你数组的容量,越界就会出现段错误。

h_l[h_i] = pos_i;
h_l[h_i + 1] = pos_j;
这里下标会不会越界呢。

谢谢帮忙,问题我通过把数组大小改大解决了。虽然之前都没有越界。

在while循环中,你的h_i值一直是0 ,
当你while循环差过10次之后, len > 10 下面的for循环中h_l[k + 1]会超过10
for (int k = 0; k < len; k = k + 2)
printf("%d %d\n", h_l[k] + 1, h_l[k + 1] + 1);

if (m == 0 && n == 0)
break;

for (i = 0; i < m; i++)
{
    for ( j = 0; j < n; j++)
    {
        if (L[i][j]<min)
        {
            min = L[i][j];
            pos_i = i;
            pos_j = j;
        }
    }
    if (min == 0)
        break;
}
len++;
h_l[h_i] = pos_i;
h_l[h_i + 1] = pos_j;

}

for (int k = 0; k < len; k = k + 2)
printf("%d %d\n", h_l[k] + 1, h_l[k + 1] + 1);

return 0;