Intentar acceder al elemento de matriz en el bucle causa un error de segmentación, ¿por qué?

Estoy tratando de crear una matriz bidimensional, que tiene 1 o 0 asignados aleatoriamente a cada coordenada. Funciona bien hasta que llega a las coordenadas [20] [3]. Después de eso, simplemente arroja el "fallo de segmentación 11".

No tengo ni idea de cómo o por qué. Especialmente porque puedo crear una matriz con 200 * 200, por ejemplo, pero todavía obtiene el mismo problema solo en las coordenadas [200] [3]. Entonces, de alguna manera, siempre es la tercera coordenada y en la última coordenada x donde se produce el error.

#include <stdio.h>
#include <stdlib.h>

int main() {

  int x, y, i, j ;
  x = 20;
  y = 20;

  int grid [x][y];

  for ( i = 0; i <= x; i++) {
    for ( j = 0; j <= y; j++) {

      grid[i][j] = rand() % 2 ;

      printf("grid [%d][%d]: %d\n", i, j, grid[i][j]);

    }
  }
  return 0;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta