Как мы используем кучи при запуске с объявлением стека? - PullRequest
0 голосов
/ 20 апреля 2020

Я новичок в C и пытаюсь создать собственную базу данных студентов. Здесь я пытаюсь создать нового студента и пытаюсь понять, как использовать объявления кучи. Вот код, который я использую с помощью объявления стека:



student* create_student(char *given_name, char *family_name, int age,
        char* gender, int *promotion)
{

    student s;
    s.given_name = given_name;
    s.family_name = family_name;
    s.age = age;
    strncpy(s.gender, gender, strlen(gender)+1);
    s.promotion = promotion;
    puts("---print inside create_student function---");
    print_student(s);
    puts("---end of print inside");
    return &s;
}

Я понимаю, что, поскольку мы используем здесь стек, информация теряется за пределами функции, однако я немного запутался в том, как Я могу "преобразовать" это в кучу.

[Я изучал C ++ раньше, поэтому я попробовал что-то вроде ученика * s = новый ученик]

Итак, мой вопрос, как бы я преобразовал это в объявление кучи, чтобы сохранить информация вне функции?

1 Ответ

1 голос
/ 20 апреля 2020

Как вы указали, если вы сохраняете student s в стеке, блок памяти освобождается, как только функция возвращается, и у вас больше нет доступа к этой информации. Такие переменные имеют то, что известно как automatic storage duration.

Использование кучи позволяет вам явно управлять памятью и, следовательно, позволяет более гибко хранить информацию, поскольку память выделяется и освобождается по запросу. Такие переменные имеют то, что известно как allocated storage duration.

Таким образом, для хранения вашей информации в куче вы используете динамические c функции выделения памяти, такие как malloc() или calloc().

В вашем случае, чтобы использовать кучу, мы сделаем:

student* create_student(char *given_name, char *family_name, int age,
        char* gender, int *promotion)
{

    student *s = malloc(sizeof(student));
    s->given_name = given_name;
    s->family_name = family_name;
    s->age = age;
    strncpy(s->gender, gender, strlen(gender)+1);
    s->promotion = promotion;
    puts("---print inside create_student function---");
    print_student(s);
    puts("---end of print inside");
    return s;
}

Когда вам больше не нужна память, выделенная в куче, вы должны освободить ее, используя free().

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