Динамически распределяя массив структур - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь создать массив структур, размер которых определяется пользователем в программе.например.p [0], p [1], p [2] .....

typedef struct
{
int score;
}player;

void main()
{
    int numPlayers;

    printf ("\nEnter number of players (1 - 4)\n");
    scanf ("%d", &numPlayers);

}

Я пытался сделать это как с

player p[numPlayers];

, так и с

player *p=malloc(numPlayers*sizeof(player));

но оба не скомпилируются.Кто-нибудь может увидеть, что здесь происходит не так?

Редактировать: Я использую VS2010.Я получаю «выражение должно иметь постоянное значение» для первого, а «значение типа« void * »не может быть использовано для инициализации сущности типа« player * »для второго.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Подход 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, поведение просто не определено. Этот тип обработки ввода подходит только для быстрых и «грязных» программ, написанных для собственного использования автора.

1 голос
/ 12 марта 2012

Возможно, вы забыли #include <stdlib.h>. Без прототипа для него компилятор будет предполагать, что malloc возвращает int, который не будет преобразован в указатель без преобразования (но не использует приведение - включите правильный заголовок, чтобы компилятор знал тип возврата вместо).

Редактировать: Это не связано, но FWIW, main должно вернуть int, а не void.

...