从堆栈声明开始时我们如何使用堆?

How do we use heaps when starting with a stack declaration?

我是 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;
}

我知道因为我们在这里使用堆栈,所以信息会在函数之外丢失,但是我有点困惑如何才能 "convert" 将其放入堆中。

[我之前学过C++,所以我尝试了student *s = new student]

所以我的问题是,如何将其转换为堆声明以便在函数外部保留信息?

正如您所指出的,如果您将 student s 保留在堆栈中,一旦函数 returns 释放内存块,您将无法再访问该信息。像这样的变量具有所谓的 automatic storage duration

使用堆允许您显式管理内存,因此允许以更灵活的方式存储信息,因为内存是根据请求分配和释放的。像这样的变量具有所谓的 allocated storage duration

因此,要将信息存储在堆中,您可以使用 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().

释放它