我经常面临这种困境:
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;
我的问题并不局限于这个特殊情况,但是,我想知道在选择一个时,一般应该考虑什么。
答案 0 :(得分:1)
内存管理。如果将列表实例作为结构的一部分,则使用结构分配/释放它。如果你指向它,你可以单独分配/释放它。如果它可能从多个地方指向和/或寿命与结构不完全一致,则单独管理它并指向它具有明显的优势。
基本上,这是一个基于您期望数据使用方式的判断调用。
答案 1 :(得分:1)
list employees; // here I used local variable instead of a pointer`
不是本地变量。
只是结构的另一个成员,它不是指针。
这是list
的完整内容,因此您无需分配该内存
答案 2 :(得分:0)
如果结构包含指针,则结构赋值将使目标结构包含指向与原始指针相同的项的指针。如果结构包含数组或嵌套结构,则目标结构将接收其自己的数组副本或嵌套结构。通常更容易推理直接封装其所有数据的结构,但如果结构包含链表,则在任何情况下都可能无法进行封装。鉴于此,基本问题是您希望employees
封装的内容。
如果您想要封装列表的视图,只要结构保持指针并且仍然在使用,该列表的视图永远不会改变,employees
可以保留list
或*list
。
如果您希望它封装一个列表的视图,该列表由某些其他代码拥有,并且head
和tail
可能会更改,那么employees
应该包含*list
。
如果您希望它封装一个独立于Universe中任何其他位置列表的列表,那么保持list
可能是合理的,但是只要复制结构,它就会必须释放目标结构的employees
列表所包含的所有项目,复制结构,然后为原始列表中的每个节点分配一个新节点,将数据复制到那里,将新节点链接到新列表,完成后,将新员工*head
和*tail
指向新列表。或者,可以employees
举行*list
;每次更改结构时需要再分配和释放,但是允许列表副本和清理代码本身更好地绑定到*list
。