迭代2D数组时索引的奇怪行为

时间:2015-01-19 12:43:40

标签: c arrays

我有一个typedef'ed结构:

typedef struct {
    int x, y;
}TPosition;

和一个函数,它返回数组中非负数的第一个元素的位置

TPosition startPos(int **arr, int lin, int col) {
TPosition p;

int i, j;
for(i = 0; i < lin; i++) {
    for(j = 0; j < col; j++) {
        if(nonNeg(arr[i][j])) {
            p.x = i;
            p.y = j;
            break;
        }
    }
    break;
}

return p;
}

main我有:pos = startPos(arr, lin, col);,其中posTPosition pos;

第一行中存在非负整数时,一切正常。如果arr是一个数组,那么:
-1 -1
 2 1
然后输出不正确。调试器显示索引j超过了边界(j = col)。

这很奇怪,虽然非常简单 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您应该将p初始化为某些内容,以便了解是否找不到任何内容。

break;是假的。将第一个替换为return p;并删除第二个,否则外部for循环在第一次迭代后将不会执行任何操作。

TPosition startPos(int **arr, int lin, int col) {
TPosition p = { -1, -1};

int i, j;
for(i = 0; i < lin; i++) {
    for(j = 0; j < col; j++) {
        if(nonNeg(arr[i][j])) {
            p.x = i;
            p.y = j;
            return p;
        }
    }
}
return p;
}

答案 1 :(得分:0)

将内部break;更改为return p;这就是我避免break;的原因,同时请注意,如果找不到位置,则会返回p未初始化,我无法告诉你如何初始化它,但我建议你选择一些无效的值,并使用它。