有一段时间我有这个结构:
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数组)?
我希望有人能够帮助我!
度过美好的一天。
答案 0 :(得分:4)
是的,您有主要的未定义行为。你不能这样索引,没有任何意义,因为你只有8x8元素的空间,字符的整数值通常大于0..7,这是你每个维度的索引空间。
它起作用是因为未定义的行为代码的行为是未定义的,并且“按预期工作(对于某些预期的值)”肯定是未定义的所有空间的一部分。基本上,你可以提出任何其他建议。 :)
在实践中,它可能有效,因为内存分配足够精细,使主要的越界访问不会落在你无法写入的任何地方。也许你错了malloc()
的簿记,但没有注意到,因为你再也没有打过free()
或malloc()
或其他什么。