您好我不确定我是否理解以下代码。如果有人能够阅读我的解释并且如果我错了就纠正我,我会很高兴。
首先,我要声明一个包含三个char和一个整数数组的结构。
struct Employee
{
char last[16];
char first[11];
char title[16];
int salary;
};
之后我声明了一个函数,它接受三个指向char和一个整数值的指针。此函数使用malloc()和sizeof()在堆上创建结构。现在这个堆上对象的创建对我来说并不是很清楚。当我使用struct Employee* p = malloc(sizeof(struct Employee))
时,完全会发生什么?
当我使用函数struct Employee* createEmployee (char* last, char* first, char* title, int salary)
多次使用不同的输入时会发生什么。我知道我将返回一个指针p但不是指向堆上相同结构的相同指针。当我多次使用该函数时,我是否会重写堆上的信息?或者它总是在不同的内存空间中创建一个新对象?
struct Employee* createEmployee(char*, char*, char*, int);
struct Employee* createEmployee(char* last, char* first, char* title, int salary)
{
struct Employee* p = malloc(sizeof(struct Employee));
if (p != NULL)
{
strcpy(p->last, last);
strcpy(p->first, first);
strcpy(p->title, title);
p->salary = salary;
}
return p;
}
如果有人能向我解释,我会很高兴。非常感谢你。
答案 0 :(得分:2)
malloc
函数在堆上分配一些新字节并返回指针。
因此createEmployee
函数在每次调用时都会分配新的内存,然后用一些数据填充它(以不安全的方式 - 考虑使用strncpy
代替)并返回指向那个记忆的指针。每次调用它时都会返回一个不同的指针。
只要不在其指针上调用free
,使用此函数创建的每个实例都将存在。
答案 1 :(得分:1)
你的第一个问题是关于malloc的问题。搜索“malloc是如何工作的?”可能会得到更好的结果。对于不同的操作系统和C库,答案是不同的。
createEmployee函数每次调用时都会创建一个全新的struct Employee。
我还看到createEmployee是以非常危险的方式编写的。在调用strcpy之前,不进行任何检查以确保字符串适合其目标。这就是缓冲区溢出的创建方式。
答案 2 :(得分:1)
malloc
为你分配一个与第一个参数相等的内存块,在本例中是Employee的大小。
每次拨打createEmployee
时,都会在malloc
拨打一个单独的时间,每次拨打malloc
时,都会为您提供一段新的记忆。
这使您可以拥有不同的员工:如果他们都使用相同的内存,那么您只能创建一个。
这就是调用free
并释放内存很重要的原因:操作系统没有其他方法可以知道你是否在使用内存。
如果您要修改现有的employee
,请维护指针,并添加strcpy(p->title, newTitle);
以将其标题更改为newTitle。
另外,提到的内容strcpy
是危险的,因为无论是否超过分配给它的11个字符,它都会继续写字符串。
答案 3 :(得分:0)
每当你打电话给malloc()
时,你都会告诉它给你一大块新的记忆,至少只要你要求的,目前还没有在其他任何地方使用过。所以下面给出了三个不同的指针:
void *p1 = malloc(100);
void *p2 = malloc(100);
void *p3 = malloc(100);
就像在自动售货机上敲按钮一样。每次,您都会得到一个符合您要求的不同糖果条(例如“Caramilk”)。