2010-03-22 165 views
0

我有不同的結構需要以相同的方式填寫。唯一的區別是它們根據不同的數據填充。將不同的結構體傳遞給一個函數c

我想知道是否有可能將不同的結構傳遞給某個函數。我想到的是這樣的:

struct stu1 { 
    char *a; 
    int b; 
}; 

struct stu2 { 
    char *a; 
    int b; 
}; 

static struct not_sure **some_func(struct not_sure **not_sure_here, original_content_list) 
{ 
     // do something and return passed struct 
     the_struct = (struct not_sure_here **)malloc(sizeof(struct not_sure_here *)20); 
     for(i=0; i<size_of_original_content_list; i++){ 
      //fill out passed structure 
     } 
    return the_struct; 
} 

int main(int argc, char *argv[]) 
{ 
     struct stu1 **s1; 
     struct stu2 **s2; 
     return_struct1 = some_func(stu1); 
     return_struct2 = some_func(stu2); 
     // do something separate with each return struct... 
} 

任何意見將不勝感激。

+1

首先,如果它們相同,爲什麼會有兩種不同的類型?在任何情況下,如果他們是相同的,演員就很安全。 – GManNickG 2010-03-22 23:42:30

+0

謝謝。正是我所期待的! – clear2k 2010-03-23 00:24:46

回答

1

在C中,指向結構的指針只是一個內存指針。所以,是的,可以將指向任何結構的指針傳遞給函數。但是,該功能需要知道結構的佈局以便對其進行有用的工作。

在你的例子中,佈局是相同的,所以它會是「安全的」......但如果其中一個結構突然改變格式並且功能沒有更新以解釋這種改變,那麼可能會有風險。

0

我認爲你的意思是結構包含相同的數據類型,只有字段的名稱不同?如果是這樣,您有兩種選擇可供您使用:

1)創建一個包含這兩個結構並且將其傳遞給some_func的聯合類型。然後它可以填寫任何一個工會成員 - 哪一個是無關緊要的,因爲兩者的內存佈局完全相同,所以它會有相同的效果。

2)只需要some_func以其中一個結構作爲參數,當你想通過另一個結構時將其轉換爲第一個結構。同樣,由於內存佈局是相同的,它會正常工作,即。

static struct stu1 **some_func(struct stu1 *not_sure_here, original_content_list) 
{ 
    ... 
} 

int main(int argc, char *argv[]) 
{ 
     return_struct1 = some_func(stu1); 
     return_struct2 = (struct stu2)some_func((struct stu1)stu2); 
} 
3

您可以使用嵌套的結構在C中做一種「繼承」。

像這樣:

struct Derived { 
    struct Base b; 
    int another_i; 
    char another_c; 
}; 

struct Derived_2 { 
    struct Base b; 
}; 

然後,它是安全的:

struct Derived d; 
struct Derived_2 d2; 
set_base((struct Base*)&d); 
set_base((struct Base*)&d2); 

這是安全的,因爲它是第一個成員。你當然可以叫他們在其他時間更類型安全的方式,像

set_base(&d.b); 

但是,這可能不是一個遍歷指向未知的對象類型方便。