【发布时间】:2020-08-02 19:39:33
【问题描述】:
我是 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]
所以我的问题是,我如何将其转换为堆声明,以便将信息保留在函数之外?
【问题讨论】:
-
如果你使用
new student之类的东西,你必须使用 C++,而不是 C。 -
您在为其他人复制字符串时分配了一些指针。你的接口是怎么定义的?字符串的内存来自哪里?谁负责分配和释放它?还。
strncpy(..strlen(gender)+1)没有任何意义。它破坏了strncpy的意图。 -
啊,好吧,我以前做过 C++,我以为你可以在 C 中使用相同的!我找到了类似 malloc 的东西,但真的能理解它
-
这能回答你的问题吗? Return address of local variable in C
-
旁白:您的
strncpy(s.gender, gender, strlen(gender)+1);调用等效于strcpy(s.gender, gender);,并且根本不提供缓冲区溢出保护。您需要将复制的数量限制为目标缓冲区的大小,并且还要注意,如果源字符串至少与目标缓冲区一样长,strncpy不会在目标缓冲区的末尾放置空终止符,所以需要额外的代码来确保目的地为空终止。
标签: c stack heap-memory