【问题标题】:C: Pointer to an array of structs inside a struct within a functionC:指向函数内结构内的结构数组的指针
【发布时间】:2018-01-29 19:20:29
【问题描述】:

我对 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 structs, How to declare pointer to array of structs in C, Pointer to array of struct in function。 我的项目正在发展到一个规模,我只是不想通过努力让它变得更好来让它变得更糟。

我需要创建一个指向 s2.s1[x] 的指针数组吗?

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

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

【问题讨论】:

  • 您的编译器是否显示任何警告?关于main()的隐式声明?
  • n 定义在哪里?
  • 你需要指针持有的元素个数。
  • @BLUEPIXY 没错,它可能是另一个结构成员。
  • @dimplemind:最好 1. 在Code Review 上发布此内容,以及 2. 使用您的 实际 代码(无论如何这都是 Code Review 的要求)。使用像 S1 和 S2 这样的混淆名称几乎不可能进行代码审查和合理的建议。

标签: c arrays pointers struct


【解决方案1】:

它没有任何问题,关键在于它是否符合您的要求,从长远来看,它是一个不错的设计选择。

另外,你可能会这样做

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

【讨论】:

    【解决方案2】:

    将结构、指针或数组放入另一个结构中称为组合。您应该将S2 数组放在S1 结构中如果它属于那里

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

    void do_stuff(struct Point pt);
    

    优于:

    void do_stuff(int x, int y);
    

    但永远不要仅仅因为你想节省一些打字时间而这样做。如果S2 适合S1,则执行此操作。 如果您的程序中“没有S2,就没有S1”,那么这是有道理的。

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

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

    【讨论】:

    • 嗯,一开始我不知道如何将结构放在一起,我想让代码运行。但他们属于一起。 “引入参数对象”看起来很有趣。我必须记住这一点。
    • @dimplemind:“引入参数对象”的想法(尽管 C 不是面向对象的)比最初看起来要酷一些,因为它允许您提取与这组相关的所有函数参数在单独的“模块”中,同时仍然将这些结构在逻辑上分开,以便有意义的功能。在 C++ 中,所有在这个新的“参数对象”上工作的函数都是其单独类的成员。但同样,如果您发布一段实际的代码来阐明这些结构实际代表什么,那就更好了。
    • 今天太晚了。我会在一分钟内离开。也许明天我至少会发布相关部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2015-06-12
    • 2013-04-18
    相关资源
    最近更新 更多