指针与结构声明中的局部变量

时间:2014-01-24 22:41:10

标签: c pointers struct

我经常面临这种困境:

typedef struct {
    char *name;
    int est;
    list *employees;
} company;

VS

typedef struct {
    char *name;
    int est;
    list employees; // here I used local variable instead of a pointer
} company;

在选择其中一个时,哪些是普遍关注的问题?

据我所知,省略指针会节省一点内存,而当多个结构使用相同的引用内存时,保持指针会很有用(这里不是这种情况)。此外,当我使用局部变量定义时,变量被赋予内存,与使用指针相反,这需要我自己malloc内存。

还有什么需要考虑的因素吗?

修改: list是一个单链接列表:

typedef struct {
    list_node *head, *tail;
} list;

我的问题并不局限于这个特殊情况,但是,我想知道在选择一个时,一般应该考虑什么。

3 个答案:

答案 0 :(得分:1)

内存管理。如果将列表实例作为结构的一部分,则使用结构分配/释放它。如果你指向它,你可以单独分配/释放它。如果它可能从多个地方指向和/或寿命与结构不完全一致,则单独管理它并指向它具有明显的优势。

基本上,这是一个基于您期望数据使用方式的判断调用。

答案 1 :(得分:1)

 list employees; // here I used local variable instead of a pointer`

不是本地变量。

只是结构的另一个成员,它不是指针。

这是list的完整内容,因此您无需分配该内存

答案 2 :(得分:0)

如果结构包含指针,则结构赋值将使目标结构包含指向与原始指针相同的项的指针。如果结构包含数组或嵌套结构,则目标结构将接收其自己的数组副本或嵌套结构。通常更容易推理直接封装其所有数据的结构,但如果结构包含链表,则在任何情况下都可能无法进行封装。鉴于此,基本问题是您希望employees封装的内容。

  • 如果您想要封装列表的视图,只要结构保持指针并且仍然在使用,该列表的视图永远不会改变,employees可以保留list*list

  • 如果您希望它封装一个列表的视图,该列表由某些其他代码拥有,并且headtail可能会更改,那么employees应该包含*list

  • 如果您希望它封装一个独立于Universe中任何其他位置列表的列表,那么保持list可能是合理的,但是只要复制结构,它就会必须释放目标结构的employees列表所包含的所有项目,复制结构,然后为原始列表中的每个节点分配一个新节点,将数据复制到那里,将新节点链接到新列表,完成后,将新员工*head*tail指向新列表。或者,可以employees举行*list;每次更改结构时需要再分配和释放,但是允许列表副本和清理代码本身更好地绑定到*list