копирование указателя на структуру не работает в c - PullRequest
0 голосов
/ 03 июня 2018

Я изучаю указатели на C, и у меня возникают проблемы с копированием указателей на структуру.

**** Полный код: https://1drv.ms/t/s!Av5xYBEjrdmuqS1sfgGB7pFCxGeu

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct cal {
    int date; 
    int time;
    int importance;
    char group[256];
    char title[256];
    char description[256];
};
long long int count = 0;


int main() {
    FILE *file;

    ......

    int *group;
    group = (int *)malloc(sizeof(int) * count);
    group = (int *)calloc(count, sizeof(int));
    struct cal *calendar;
    calendar = (struct cal *)malloc(sizeof(struct cal)*count);
    calendar = (struct cal *)calloc(count, sizeof(struct cal));


    for (int i = 0; i < count; i++) {
        char *ptr = strtok(arrs[i], " ");
        while (ptr != NULL) {
            calendar[i].date = 'ptr';
            ptr = strtok(NULL, " "); //date
            calendar[i].time = 'ptr';
            ptr = strtok(NULL, " "); //time
            calendar[i].importance = 'ptr';
            ptr = strtok(NULL, " "); //importance
            *calendar[i].group = 'ptr';
            ptr = strtok(NULL, " ");//group END
            *calendar[i].title = 'ptr';
            ptr = strtok(NULL, " ");//Title
            *calendar[i].description = 'ptr';
            ptr = strtok(NULL, " ");//Discription
        }
    }
    for(int i=0;i<count;i++) 
        printf("%d  %d %d %s  %s %s\n", calendar[i].date, calendar[i].time,
               calendar[i].importance, calendar[i].group, calendar[i].title,
               calendar[i].description);

}

ввод должен бытьна input.txt.например:

YYYYMMDD HHmm [importance] [Group(string)] [title] [discription]  (\n)
YYYYMMDD HHmm [importance] [Group(string)] [title] [discription]  (\n)
YYYYMMDD HHmm [importance] [Group(string)] [title] [discription]  (\n)
YYYYMMDD HHmm [importance] [Group(string)] [title] [discription]  (eof)

Вывод должен быть суммой тех же групп из группы 0-4.пр) 1 0 1 2 0

в

for (int i = 0; i < count; i++) {
            .....
        }

Партия не работает.указатель 'ptr' не копируется в 'calendar [i] .somthing'.Я пытался использовать календарь [i] .date = '* ptr';но это тоже не работает.

1 Ответ

0 голосов
/ 03 июня 2018

Паркуйтесь, вам, вероятно, понадобится очистить эти части кода и, возможно, отредактировать его с помощью нового кода, чтобы было ясно, что вы пытаетесь выполнить.Для начала давайте посмотрим на обязанности, которые вы несете при динамическом распределении памяти:

Нет необходимости приводить к возвращению 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 каждый раз, когда вызываете его, иначе вы не можете быть уверены, что обрабатываете в коде фактические данные (а не мусор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...