c - 嵌套 for 循环的索引值达到 500 万 - C

标签 c

我正在编写棋盘游戏,我需要将字符值分配给二维数组。为此,我使用了一个嵌套的 for 循环,其中 i 作为行索引,j 作为列索引。对于 4x4 维度 (n=4),循环工作正常,直到第二行。在 codelite 上使用调试器,我注意到 j 的值并没有像它应该的那样从 0 增加到 1,而是增加到 5,560,570,从而中断了循环。我还注意到,当使用大于 4 的维度时,程序根本无法显示任何内容。这是内存错误吗?我很困惑,也向其他多人展示了这一点。

int main(void){
int n;
char board[n][26];
printf("Enter the board dimension: ");
scanf("%d", &n);
for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++){
        if((i == (n/2)-1 && j == (n/2)-1) || (i == (n/2) && j == (n/2))){
            board[i][j] = 'W';
        }
        else if((i == (n/2) && j == (n/2)-1) || (i == (n/2)-1 && j == (n/2))){
            board[i][j] = 'B';
        }
        else{
            board[i][j] = 'U';
        }
    }
}

最佳答案

看来您在设置n 之前,在board 的声明中使用了它。因为这是未定义的行为,所以绝对允许发生任何事情;在这种情况下,这会破坏其他变量的值。

要解决此问题,您可能应该等到在 scanf 中初始化 n 之后声明 board,如下所示:

 int main(void) {
     int n;
     printf("Enter the board dimension: ");
     scanf("%d", &n);
     char board[n][26];
     ...
  }

正如评论中指出的那样,如果 n > 26,这仍然会导致问题,并且对于 n != 26 可能会造成浪费。由于数组在 C 中的工作方式,解决这个问题可能需要重新考虑板的存储方式。

关于c - 嵌套 for 循环的索引值达到 500 万 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55035241/

相关文章:

c++ - 将 unsigned short 转换为 char

c - 如何将一维数组复制到另一个二维数组的一部分,反之亦然?

c - c (libzmq) 中的 Zeromq pub/sub 示例带有工作过滤器(在 Windows 上)?

c - notification_notification_new 不显示图标

c - 读取文件到字符串

objective-c - 混合 C 和 objective-C

c++ - 为什么函数指针定义可以使用任意数量的与号 '&' 或星号 '*' ?

c - i386-elf-gcc 输出关于 "static a = 0"的奇怪汇编命令

c++ - extern "C"没有禁用名称修改

c - 如何从不是字节对齐的源复制内存(移位)