使用指针和结构

时间:2010-12-20 17:07:08

标签: c

您好我不确定我是否理解以下代码。如果有人能够阅读我的解释并且如果我错了就纠正我,我会很高兴。
首先,我要声明一个包含三个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; 
}

如果有人能向我解释,我会很高兴。非常感谢你。

4 个答案:

答案 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”)。