2011-02-06 51 views
1

我在編寫一個函數來分配一個C中的結構時遇到了問題。理想情況下,我希望函數用傳遞給它的參數填充結構的字段。從函數中分配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 */ 

如何做到這一點有什麼建議?

+2

我認爲這將是有益的,如果你能介紹更多你想如何此功能將使用什麼與創建的結構做了一點。你如何在C中分配內存和創建數據結構很大程度上取決於你如何計劃使用它們。 – linuxuser27 2011-02-06 03:18:03

回答

1

你必須返回通過的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*

+0

我不知道你給點(1)的建議......只要`NAME_SIZE`是一個合理的大小,它真的不值得它做對 - 動態分配內存並且必須管理它。沒有必要使其複雜化。 – 2011-02-06 03:36:46

5

您當前的代碼存在的問題是您創建的結構在堆棧上創建,並且只要函數返回就會被清除。

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.添加一些函數指針的struct的「面向對象」(獲得多態行爲),你有一些有趣的事情,但我要說對C++在這一點上)

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; 
    } 
} 
1
  1. 爲什麼會出現使員工返回空隙?您需要從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()員工!