Совет leiz верен, вы действительно должны распределять его динамически, иначе вы рискуете столкнуться с ситуацией, если размер массива больше, чем доступная память в стеке.
Также неверна формула, которую вы используете для отображения двумерной сетки в одномерный массив. Вы должны умножаться на y_size вместо x_size.
life_matrix[counter*(int)y_size+counter2] = rand()%2;
или вы можете перевернуть жетоны
life_matrix[counter2*(int)x_size+counter] = rand()%2;
Другим подходом к решению этой проблемы будет использование его в качестве одномерного массива для инициализации:
for(int n = 0; n < x_size * y_size; ++n) {
life_matrix[n] = rand()%2;
}