使用C中的字符访问数组

时间:2017-11-29 13:42:33

标签: c arrays multidimensional-array

有一段时间我有这个结构:

struct coordinates{
    struct coord coord_board[8][8];
};

我用

初始化了它
coordBoard = malloc(sizeof(struct coordinates));
for (col = 'a'; col <= 'h'; col++) {
        for (row = '1'; row <= '8'; row++) {
            initializeCoord(col, row);
        }
}

void  initializeCoord(char col, char row) {
    coordBoard->coord_board[col][row].Iter = 0;
    coordBoard->coord_board[col][row].occupant = NULL;
}

所以这实际上已经有一段时间了。我甚至可以使用chars访问它们:

void printCoordBoard() {
    char col, row;
    printf("\n");
    for (col = 'a'; col <= 'h'; col++) {
        for (row = '1'; row <= '8'; row++) {
            struct coord l = board->coordBoard->coord_board[col][row];
            printf("%c ", l.occupant == NULL ? ' ' : l.occupant->type);
        }
        printf("\n");
    }
}

这也有效。但现在它没有 - 我不知道我做了什么让它失败。虽然当我考虑它时,它是有道理的。我用了C已经有一段时间了,但我记得所有数组都是用整数访问的 - 对吗?我将它们初始化为array[8][8]。因此当我使用例如访问它时'a',我实际上访问位置97(char a的十进制值),对吗?当然,我有内存腐败。

我的问题是:它为什么有效?甚至更奇怪 - 如果我将数组更改为[7] [7],它再次起作用......我感到困惑。另一个问题是 - 在C中是否有办法使用字符来访问数据,必须初始化一个最高字符数组(在这种情况下为'h',它会产生一个104x104数组)?

我希望有人能够帮助我!

度过美好的一天。

1 个答案:

答案 0 :(得分:4)

是的,您有主要的未定义行为。你不能这样索引,没有任何意义,因为你只有8x8元素的空间,字符的整数值通常大于0..7,这是你每个维度的索引空间。

它起作用是因为未定义的行为代码的行为是未定义的,并且“按预期工作(对于某些预期的值)”肯定是未定义的所有空间的一部分。基本上,你可以提出任何其他建议。 :)

在实践中,它可能有效,因为内存分配足够精细,使主要的越界访问不会落在你无法写入的任何地方。也许你错了malloc()的簿记,但没有注意到,因为你再也没有打过free()malloc()或其他什么。