Во-первых, для ваших заявленных целей, декларация:
int (*gameInfo)[2]; // [0] # of fouls || [1] # of players
Может быть:
int *gameInfo[2]; // [0] # of fouls || [1] # of players
Тогда распределение для обоих элементов массива будет выглядеть так:
int size = 10; // for example
gameInfo[0] = malloc(size * sizeof(*gameInfo[0]));
gameInfo[1] = malloc(size * sizeof(*gameInfo[1]));
Это, по сути, создает количество пространства , эквивалентное тому, которое вы имели бы с двумерным массивом int, например:
int gameInfo[2][10];
После использования освободите их:
free(gameInfo[0]);
free(gameInfo[1]);
Лучшим вариантом , как упоминалось в комментариях, может быть создание структуры:
typedef struct {
int fouls;
int players;
} GAME;
Использование может включать создание, использование и освобождение массива игр:
GAME *game;
game = calloc(10, sizeof(*game));
...
game[0].fouls = 3;
game[0].players = 2;
...
game[9].fouls = 6;
game[9].players = 3;
...
free(game);