如何在C中定义“复杂”结构

时间:2018-08-17 09:32:41

标签: c struct

假设我有两个简单的结构:

  struct Point{

        double x;
        double y;

    };

    struct Err{

        double xx;
        double xy;
        double yy;

    };

我有两种选择来定义复杂的结构:

选项1-直接

struct Measure {

    Point P;
    Err E;

};

struct State {

    Measure Pos;
    Measure Vel;
    Measure Acc;

};

选项2-指针

struct PMeasure {

    Point *P;
    Err *E;

};

struct PState {

    Measure *Pos;
    Measure *Vel;
    Measure *Acc;

};

这两个选项的优缺点是什么?

5 个答案:

答案 0 :(得分:3)

在两种情况下,您需要使用指针以及C中的mallocreallocfree

  • 您的对象非常大。至少一百个字节。
  • 您不知道将要有多少个对象,因此您需要一个扩展数组。或更高级的列表,地图,哈希或树木。

您的对象看起来不需要指针。您可能最终需要一个指向State数组开始的指针。

答案 1 :(得分:3)

选项1

  • 易于复制
  • 易于初始化
  • 难以移动(必须将数据复制到新结构)
  • 没有内存泄漏的风险

选项2

  • 难以复制,因为您不仅需要存储结构,还需要存储其所有指针成员
  • 难以初始化(需要将所有成员的指针设置为合理的值)
  • 易于移动(只需移动指针,无需复制数据)
  • 如果忘记释放指针,内存泄漏的风险

因此,对于简单的东西,我会选择选项1。但是对于更复杂的东西,请使用选项2,但是将所有初始化,克隆和销毁都包装到特定的函数中。

答案 2 :(得分:2)

这取决于您要分配实际内存的位置。选项1与结构一起分配内存。选项2假定内存已分配到其他位置。

通常情况下,选项1可能最有用。如果您是初学者,则可以在此处停止阅读并选择选项1。

选项2可能有其特殊用途,例如,如果您希望构建诸如查找表之类的内容,或者出于某种原因必须使用所有对象的堆分配(如果它们是例如太大而无法放在堆栈上。

答案 3 :(得分:1)

基本上,在创建指针时,必须分配空间并将该空间的地址保存到指针中。你要写什么在这里很重要。您可以静态分配,也可以动态分配。每当分配空间时,就在不再需要它们时必须释放它们。实际上取决于您的设计选择哪个。

答案 4 :(得分:1)

如果您不明白为什么第二个选项可能导致内存问题,那么请坚持使用选项1。指针非常有用,并且可以使用C语言中的动态内存分配或直接访问其他指针。变量。但是:

  1. 除非指针指向有效对象或某些已分配的内存,否则不能使用指针
  2. 必须释放每个分配的内存,以避免内存泄漏

如果您不严格遵守上述规则,则您的程序将出现内存问题...