簡體   English   中英

C:指向函數內結構內部的結構數組的指針

[英]C: Pointer to an array of structs inside a struct within a function

我對C很陌生。我創建了一個結構和一個結構數組來存儲數據,並將每個結構傳遞給我的函數:

int dosomething(struct s1 *struct1, struct s2 *struct2);

struct S1 {
    int a;
    int b;
    int c;
};

struct S2 {
    double x;
    double y;
    double z;
};


int main()
{
    int n = 200;
    struct S1 s1;
    struct S2 *s2 = malloc(n * sizeof(struct S2));

    dosomething(&s1, &s2[0])

    return 0;
}

int dosomething(struct S1 *s1, struct S2 *s2)
{
    s1->a = 1;
    s1->b = 2;
    s1->c = 3;

    s2[0].x = 1.1;
    s2[1].x = 1.123233;
    ...

    return 1;
}

隨着時間的流逝,這變得很煩人,所以我決定將它們放在一起。 現在我正在做這個

struct S1 {
    int a;
    int b;
    int c;
    struct S2 *s2;
};

struct S2 {
    double x;
    double y;
    double z;
};


int main()
{
    int n = 200;
    struct S1 s1;
    struct S2 *s2 = malloc(n * sizeof(struct S2));
    s1.s2 = s2;

    dosomething(&s1)

    return 0;
}


int dosomething(struct S1 *s1)
{
    s1->a = 1;
    s1->b = 2;
    s1->c = 3;

    s1->s2[0].x = 1.1;
    s1->s2[1].x = 1.123233;
    ...

    // OR

    struct S2 *s2 = s1->s2;
    s2[0].x = 1.1;
    s2[1].x = 1.123233;
    ...
}

現在,事情是:我讀了很多關於結構,數組,結構數組等的指針,但是我仍然不確定,我在這里做的是否正確。 C:指針的指針數組結構(分配/釋放的問題)C指針,指向結構的數組如何聲明指針在C結構的數組指向在功能結構的陣列 我的項目越來越大,我只是不想通過嘗試使其變得更好而變得更糟。

我是否需要創建一個指向s2.s1 [x]的指針數組?

我是否需要告訴一個指針(結構S2 * s2 = s1-> s2)s2有多少元素?

有陷阱嗎?

它沒有錯,這取決於它是否符合您的要求,並且從長遠來看,它是一個不錯的設計選擇。

另外,您可能可以

s1.s2 = malloc(sizeof *s1.s2);
if (s1.s2 == NULL)
    error_handler(); // do not use s1.s2 after this
dosomething(&s1);

將一個結構,指針或數組放置在另一個結構內被稱為composition 如果S2數組屬於該數組,則應將其放置在S1結構中。

例如,一個Point是一對(x, y)坐標,因此很明顯它應該由兩個int組成,即:

void do_stuff(struct Point pt);

優於:

void do_stuff(int x, int y);

但是絕對不要僅僅因為您想保留一些輸入而這樣做。 如果S2裝入S1內,則執行此操作。 如果程序中沒有“沒有S2 S1 ”,那就有意義。

因此,如果這兩個結構屬於一起,但是您發現自己將相同的參數序列傳遞給多個函數,則可以使用一種稱為“引入參數對象”的OOP重構技術。 即而不是這樣做:

do_stuff(&s1, &s2, &s3);

您可以創建一個新的結構,其結構僅由這些參數組成:

struct StuffParameters {
    struct S1 * s1;
    struct S2 * s2;
    struct S3 * s3;
};

然后,您可以將其傳遞給多個“相似”功能:

struct StuffParameters parameters = { &s1, &s2, &s3 };

do_stuff(&parameters);
do_some_other_stuff(&parameters);
yet_another_function(&parameters);

暫無
暫無

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

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