C:指向函数内结构内部结构数组的指针

时间:2017-08-21 16:26:48

标签: c arrays pointers struct

我是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: pointer to array of pointers to structures (allocation/deallocation issues)c pointer to array of structsHow to declare pointer to array of structs in CPointer to array of struct in function。 我的项目正在发展到一个规模,我只是想通过努力让它变得更好而让它变得更糟。

我是否需要创建一个指向s2.s1 [x]?

的指针数组

我是否需要告诉一个指针(结构S2 * s2 = s1-> s2)s2有多少元素?

是否有任何陷阱或可能出现问题?

2 个答案:

答案 0 :(得分:0)

它没有任何问题,它是否符合您的要求,从长远来看,它是一个很好的设计选择。

另外,你可以做到

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

答案 1 :(得分:0)

将结构,指针或数组放在另一个结构中称为 composition 。您应该将S2数组置于S1结构(如果它属于)中。

例如,Point是一对(x, y)坐标,因此很明显它应该由两个int组成,即:

void do_stuff(struct Point pt);

优于:

void do_stuff(int x, int y);

但绝不要因为你想节省一些打字而这样做。如果S2适合S1,请执行此操作。如果"没有S1没有S2"在你的程序中,它是有道理的。

因此,如果这两个结构属于一起,但是您发现自己将相同的参数序列传递给多个函数,那么您可以使用名为{{的OOP重构技术的变体3}}。即而不是这样做:

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