c 中的变量随机改变值

Mic*_*cio 1 c variables

我在学校学习 C,作为作业我必须编写井字游戏。“算法”没有问题,但我不明白为什么如果我改变变量声明的顺序,程序输出会急剧变化,甚至程序停止工作。例如,如果我将第 12 行与第 13 行交换,则数组坐标的元素会在程序的随机点处更改值。有人可以解释一下为什么会发生这种情况吗?

#include <stdio.h>

#define DIM 3
#define MAX 11

int main(void) {
    char c;
    int state = 0;   //Variable for the switch case
    int nC, nR;     //Variables used to count how many X or O there are in the rows and columns of the grid
    int i, j;       
    int coord[2] = {0, 0};     //Array for the coordinates

    char grid[DIM][DIM];        //Grid 3x3
    char player1[MAX] = "", player2[MAX] = "";       //Name of the players

    printf("Player 1, insert your name (max 10 characters): ");
    gets(player1);
    fflush(stdin);
    printf("Player 2, insert your name (max 10 characters): ");
    gets(player2);

    for (i = 0; i < DIM; i++) {                       //Inizialize the grid with '.' 
        for (j = 0; j < DIM; j++) {
            grid[i][j] = '.';
            printf("%3c", grid[i][j]);
            if (j == 0 || j == 1) printf(" |");
        }

        if (i == 0 || i == 1) printf("\n- - - - - - - -\n");
    }

    do{
        switch (state) {
            case 0:             //State 0: Player 1 is asked for the coordinates corresponding to the position where you want to insert the X symbol
            printf("\n%s your turn: ", player1);
            scanf("%d %d", &coord[1], &coord[2]);

            if (grid[coord[1] - 1][coord[2] - 1] == '.' && grid[coord[1] - 1][coord[2] - 1] != 'O') {         //Check that the selected coordinates are free. Otherwise it prints an error message
                grid[coord[1] - 1][coord[2] - 1] = 'X';
                c = 'X';
                state = 2;
            }
            else{
                state = 0;
                printf("Invalid coordinates!\n");
            }
            
            break;

            case 1:             //State 1: Player 2 is asked for the coordinates corresponding to the position where you want to insert the O symbol         
            printf("\n%s your turn: ", player2);
            scanf("%d %d", &coord[1], &coord[2]);

            if (grid[coord[1] - 1][coord[2] - 1] == '.' && grid[coord[1] - 1][coord[2] - 1] != 'X') {         //Check that the selected coordinates are free. Otherwise it prints an error message
                grid[coord[1] - 1][coord[2] - 1] = 'O';
                c = 'O';
                state = 2;
            }
            else{
                printf("Invalid coordinates!\n");
                state = 1;
            } 

            break;

            case 2:                 //State 2: Check if there a right combination of X or O
            printf("\n");

            for (i = 0; i < DIM; i++) {
                for (j = 0; j < DIM; j++) {
                    printf("%3c", grid[i][j]);
                    if(j == 0 || j == 1) printf(" |");
                }

                if (i == 0 || i == 1) printf("\n- - - - - - - -\n");
            }

            nC = 0;
            nR = 0;
            
            i = coord[1] - 1;
            for (j = 0; j < DIM; j++) {
                if(grid[i][j] != c){
                    break;
                }
                else{
                    nR++;
                }
            }

            j = coord[2] - 1;
            for (i = 0; i < DIM; i++) {
                if (grid[i][j] != c) {
                    break;
                }
                else{
                    nC++;
                }
            }
            
            if (nC == 3 || nR == 3) state = 3;
            else if (c == 'X') state = 1;
            else state = 0;

            break;

            case 3:
            if (c == 'X') printf("\n%s IS THE WINNER!\n", player1);
            else printf("\n%s IS THE WINNER!\n", player2);
            return 0;

            break;
        }
    } while (1);
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 5

在 C 中,具有n 个元素的数组的数组索引从 0 到n \xe2\x88\x921。

\n

int coord[2] = {0, 0};定义coord有两个元素,因此它们的索引为 0 和 1。

\n

整个代码中都使用了coord[1]和。位于定义的数组之外,因此程序的行为不是由 C 标准定义的。coord[2]coord[2]

\n