Паркуйтесь, вам, вероятно, понадобится очистить эти части кода и, возможно, отредактировать его с помощью нового кода, чтобы было ясно, что вы пытаетесь выполнить.Для начала давайте посмотрим на обязанности, которые вы несете при динамическом распределении памяти:
Нет необходимости приводить к возвращению malloc
, это не нужно.См .: Я приведу результат malloc?
В любом написанном вами коде, который динамически распределяет память, у вас есть 2 обязанностей в отношении любого выделенного блока памяти: (1) всегда сохраняет указатель на начальный адрес для каждого выделенного вами блока памяти, поэтому (2) может быть освобожден когда он больше не нужен.
int *group;
group = (int *)malloc(sizeof(int) * count);
group = (int *)calloc(count, sizeof(int));
Сохраняли ли вы указатель на каждый выделенный блок?(подсказка: нет).После вашего первого выделения group
он содержит первый адрес в блоке, который вы выделили с помощью malloc
.На данный момент все в порядке.
Затем вы звоните calloc
, назначая новый адрес для group
.Что случилось со старым адресом group
?Тот, который вы должны были сохранить, чтобы гарантировать, что блок памяти может быть освобожден без необходимости.Как вы собираетесь вернуть этот адрес (подсказка: вы не можете его пропустить ... Это то, что известно как утечка памяти .
Если вы делаете второй вызовс calloc
, потому что вы хотите, чтобы все байты в блоке, который вы выделяете, были инициализированы нулем, а затем не используйте malloc
, просто используйте один вызов calloc
. Никогда не будет никаких причин для malloc
и calloc
тот же указатель - нет.
Вы делаете то же самое с calendar
. Поскольку вы делаете то же самое, следуют те же самые плохие результаты.
Все, что вам нужно, это:
group = calloc (count, sizeof *group);
, а затем
calendar = calloc (count, sizeof *calendar);
Все это порождает вопрос - почему вы вообще выделяете malloc
и calloc
? Вы можете просто создать целое число Массив с автоматическим хранением и экземпляром календаря таким же образом (выделения не требуются). Похоже, на данном этапе это был бы гораздо лучший подход для вас. В динамическом распределении нет ничего плохого,и вы будете использовать его совсем немного, но учитывая ваш текущийИз-за сложностей с концепцией вы можете оставить ее на некоторое время позже и просто использовать автоматическое хранилище, предусмотренное для массивов и структур.(это имеет еще больший смысл, если учесть, что у вас в calendar
нет ничего, что требует дальнейшего выделения)
Наконец, при использовании strtok
(или любой другой функции, которую вы используете, критичной для ввода в вашу программу)- вы должны проверять return каждый раз, когда вызываете его, иначе вы не можете быть уверены, что обрабатываете в коде фактические данные (а не мусор).