Есть несколько проблем с вашим кодом.
Во-первых, вы, кажется, путаете объявление типа данных с фактической переменной. Вы объявляете struct
, и с тех пор это тип данных, очень похожий на int
или double
. Прежде чем назначить что-либо одному, вам нужно его иметь. Вы можете получить его, определив его в функции (ALPHA a;
) или выделив память для одного с помощью malloc()
или calloc()
.
Чтобы использовать calloc()
, у вас есть два аргумента: один - сколько вам нужно, а другой - размер чего угодно. Для malloc()
вы умножаете два. Другое отличие состоит в том, что malloc()
возвращает память с тем, что было в ней, в то время как calloc()
инициализирует все до нуля. (Это строка нулевой длины или целые нули в соответствии со Стандартом. Другие значения не гарантируются, но в большинстве современных систем вы получите эквивалент ноля.) Эти функции возвращают указатель на выделенную память.
Кажется, вам нужны tot
int
s, поэтому (используя calloc()
) правильное утверждение будет выглядеть примерно так: int * a = calloc(tot, sizeof(int));
или int * a = calloc(tot, sizeof(*a));
В C не требуется приведение (это требуется в C ++, но вы обычно не используете malloc()
или calloc()
в C ++), и единственное, что он может сделать, это скрыть возможную ошибку (исключив #include <stdlib.h>
) чтобы быть конкретным).
Получив это, вы можете ссылаться на int
как что-то вроде a[3]
.
Поместить результат в поле ALPHA
выполнимо, но вам действительно нужен ALPHA
, так что-то вроде
ALPHA a;
a.size = calloc(tot, sizeof(*a));
будет работать. Поэтому вы бы назвали его, например, a.size[3]
.
Кроме того, я не вижу, что делает name
. Это один символ, которого недостаточно для любой непустой строки, и я не знаю, почему вы получили его в вызове calloc()
. Возможно, вы захотите, чтобы name
была динамически размещаемой строкой с размером size
. В этом случае вам нужно изменить строки в объявлении ALPHA
на
int size;
char * name;
и код может быть
ALPHA a;
fgets(line, 60, fp);
a.size = atoi(line);
a.name = calloc(a.size, sizeof(*a.name));
Как только вы это сделаете, после ввода 10 вы можете обратиться к a.name[0]
- a.name[9]
, и это ваши десять символов. a.name[10]
будет один за концом. Обратите внимание, что в массив из десяти символов можно поместить только строку из девяти символов, поскольку вам нужно иметь место для нулевого терминатора ('\0'
, который является последним символом любой строки в стиле C). Если вы хотите иметь возможность ввести указанное количество символов, вам нужно добавить 1 к a.size
после ввода введенного пользователем номера.