c - 从堆栈声明开始时我们如何使用堆?
问题描述
我是 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 之类的东西]
所以我的问题是,我将如何将其转换为堆声明以便将信息保留在函数之外?
解决方案
正如您所指出的,如果您保留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()
.
推荐阅读
- ios - Swift Selector 函数中的原始类型参数
- javascript - 如何在字符串中的特定文本之后插入值
- c - 如果语句不适用于 C 中的 char
- reactjs - 在 React Typescript 中传递带有 props 的组件作为 prop
- javascript - 改进设置值之间的所有唯一组合导致目标数总和的功能
- java - 如何修复 Android Studio 中的“at android.view.View.jumpDrawablesToCurrentState(View.java:22662)”错误
- linux - 来自主机的特定容器的`ps`
- css - Tailwind CSS,React JS - 过渡和变换导致导航栏重叠
- postgresql - Postgres 将 2 列选择为 1 个没有空值的组合列
- python - 在 pandas 中使用 str.contains 而不是 .isin