从堆栈声明开始时我们如何使用堆?
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()
.
释放它
我是 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()
.