从C中的函数分配struct

时间:2011-02-06 03:11:12

标签: c function struct

我在编写一个在C中分配结构的函数时遇到了问题。理想情况下,我希望函数使用传递给它的参数填充结构的字段。

我在头文件中定义了结构,如下所示:

typedef struct {
  char name[NAME_SIZE]; //Employee name
  int birthyear; //Employee birthyear
  int startyear; //Employee start year
} Employee;

这就是我目前的职能所在:

void make_employee(char _name, int birth_year, int start_year) {
  Employee _name  = {_name,birth_year,start_year}; //allocates struct with name
} /* end make_employee function */

关于如何实现这一目标的任何建议?

4 个答案:

答案 0 :(得分:6)

您当前代码的问题在于您创建的结构是在堆栈上创建的,并且会在函数返回后立即清除。

struct foo
{
    int a;
    int b;
};

struct foo* create_foo( int a, int b )
{
    struct foo* newFoo = (struct foo*)malloc( sizeof( struct foo ) );
    if( newFoo )
    {
        newFoo->a = a;
        newFoo->b = b;
    }
    return newFoo;
}

这将为您提供堆分配的对象。当然,你需要一个释放内存的函数,否则这就是内存泄漏。

void destroy_foo( struct foo* obj )
{
    if( obj )
        free( obj );
}

void print_foo( struct foo* obj )
{
    if( obj )
    {
        printf("foo->a = %d\n",obj->a);
        printf("foo->b = %d\n",obj->b);
    }
}

(顺便说一句,这种风格让你成为“面向对象”的一部分C.添加一些函数指针到结构(以获得多态行为)并且你有一些有趣的东西;虽然我认为C ++在那里点。)

答案 1 :(得分:3)

您必须返回通过malloc分配的指针:

Employee* new_employee(char *_name, int birth_year, int start_year) {
    struct Employee* ret = (struct Employee*)malloc(sizeof(struct Employee));
    ret->name = _name;
    ret->birth_year = birth_year;
    ret->start_year = start_year;
    return ret;
}

还有两件事:(1)你应该将名称的结构定义设为char*而不是char[NAME_SIZE]。分配char数组会使结构更大,更不灵活。无论如何,你真正需要的只是一个char*。 (2)将函数定义更改为char*

答案 2 :(得分:1)

Employee * make_employee(char *_name, int birth_year, int start_year)
{
    Employee *employee;

    if (employee = (struct Employee *)memalloc(sizeof(Employee)) == NULL)
    {
        return NULL;
    }
    else
    {
        strcpy(&(employee->name), _name);
        employee->birthyear = birth_year;
        employee->startyear = start_year;
        return employee;
    }
}

答案 3 :(得分:1)

  1. 为什么make Employee返回void?您需要从make_employee函数返回Employee!

  2. 您是否遇到编译器抱怨x = {a,...}语法的问题?写下很长的路:Emp e; e.field1 = a; ...

  3. 您是否有奇怪的覆盖/伪造数字问题?如果在函数中分配一个结构,它将在函数返回后变为无效(并且容易被覆盖)!要解决这个问题,您必须:

    • 返回结构的副本(对于小结构,这是可以的):

      Employee make_emp(int a){
          Emp emp; //Allocate temporary struct
          emp.filed1 = a; //Initialize fields;
          return emp; // Return a copy
      }
      
    • 在堆中分配结构,并通过引用(即:指针)来处理它:

       Employee* make_emp(int a){
          Emp* emp = malloc(sizeof(Emp)); //Allocate the struct on the heap
                                          //And get a reference to it
          emp->filed1 = a; //Initialize it
          return emp; //Return the reference
       }
      

      在这种情况下完成后,不要忘记free()员工!