首页 > 解决方案 > 从堆栈声明开始时我们如何使用堆?

问题描述

我是 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++,所以我尝试过类似 student *s = new student 之类的东西]

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

标签: cstackheap-memory

解决方案


正如您所指出的,如果您保留student s在堆栈中,则一旦函数返回,内存块就会被释放,您将无法再访问该信息。像这样的变量具有所谓的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().


推荐阅读