簡體   English   中英

將不同的結構傳遞給c中的函數

[英]passing different structs to a function in 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...
}

任何意見將不勝感激。

您可以使用嵌套結構在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 );

但這在指向未知對象類型的指針的循環中可能並不方便。

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

在您的示例中,布局是相同的,因此它是“安全的” ...但是,如果其中一種結構突然更改格式並且未更新功能以解決該更改,則可能會有風險。

我認為您的意思是這些結構包含相同的數據類型,並且只有字段名稱不同? 如果是這樣,您有兩種選擇:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM