我在编写一个在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 */
关于如何实现这一目标的任何建议?
答案 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)
为什么make Employee返回void?您需要从make_employee函数返回Employee!
您是否遇到编译器抱怨x = {a,...}
语法的问题?写下很长的路:Emp e; e.field1 = a; ...
您是否有奇怪的覆盖/伪造数字问题?如果在函数中分配一个结构,它将在函数返回后变为无效(并且容易被覆盖)!要解决这个问题,您必须:
返回结构的副本(对于小结构,这是可以的):
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()
员工!