Подход player p[numPlayers];
требует "массива переменной длины". Эта функция появилась на диалекте GNU C много лет назад и была принята в язык C в 1999 году. Для компиляции вам нужен компилятор, который распознает это как расширение, или компилятор C99. Массивы переменной длины имеют обратную сторону: они обычно реализуются путем выделения памяти в стеке. Невозможно определить, достаточно ли памяти или нет.
Синтаксис вызова malloc у вас в порядке:
player *p=malloc(numPlayers*sizeof(player));
Однако, если вы хотите написать это где-нибудь в вашей функции, вам нужно использовать компилятор C99 или компилятор, который принимает смешанные операторы и объявления (например, GNU C, который имел это в качестве расширения в течение многих лет до этого). C99 и принимает его по умолчанию. В C90 вы должны объявить указатель в блоке объявлений в верхней части функции (или в скобках): player *p = NULL;
. Затем, после того, как число игроков известно, присваивают это p = malloc ...
.
Вы должны опубликовать реальную программу, которая не компилируется. Без этого мы только догадываемся!
Кроме того, у вас есть некоторые проблемы.
Во-первых, если вы хотите вызвать malloc
, вы должны включить заголовок <stdlib.h>
, где объявлен malloc.
Во-вторых, main
должен возвращать тип int
, а не void
.
Также проверьте возвращаемое значение scanf
. Функция scanf
не подходит для интерактивного ввода. Например, если пользователь нажимает Enter, scanf
продолжает ждать ввода, ища эти числовые символы, что недружественно. scanf
также не имеет проверки ошибок в %d
. Если вы введете число, которое не вписывается в тип int
, поведение просто не определено. Этот тип обработки ввода подходит только для быстрых и «грязных» программ, написанных для собственного использования автора.