【发布时间】:2019-09-08 16:28:49
【问题描述】:
在设计包含文本数据的结构时,我一直使用以下两种基本方法:
typedef struct {
STRING address1;
STRING address2;
STRING city;
STRING state;
STRING zip;
} ADDRESS;
typedef struct {
STRING* address1;
STRING* address2;
STRING* city;
STRING* state;
STRING* zip;
} ADDRESS;
其中 STRING 是一些可变长度的字符串存储类型。指针版本的优点是我可以存储表示数据丢失的 NULL。例如,可能没有为某些地址提供 address2。在嵌入字符串的类型中,我必须使用“空白”字符串,即长度为 0 的字符串。
使用指针有(可能)更多的代码负担,因为我必须在使用前检查每个成员是否为 NULL。然而,优势并不是那么大,因为通常也必须检查嵌入式版本。例如,如果我正在打印一个地址,我必须检查一个零长度的字符串并跳过该行。使用指针,用户实际上可以表明他们想要一个“空白”而不是一个缺失值,尽管很难看到这样做的用途。
在创建或释放结构时,指针会添加一堆额外的步骤。我的直觉是标准化嵌入式样式以节省这些步骤,但我担心可能存在隐藏的问题。这是没有根据的恐惧,还是我应该出于某些令人信服的原因使用指针?
请注意,内存使用是一个问题,但它非常小。指针版本需要更多内存,因为除了结构之外,我还存储指向结构的指针。但是每个字符串结构平均可能需要 40 个字节,所以如果我存储 4 个字节的指针,那么指针版本可能会多消耗 10% 的内存,这并不重要。可能使用空指针并不会节省大量内存,因为大多数字段都已填充。
问题是关于地址而不是字符串
一些受访者似乎很困惑,认为我在询问全局权衡,例如如何最小化我的总工作量。事实并非如此。我问的是如何设计地址,而不是字符串。 address 的成员可以有固定的数组,或者在其他情况下没有。就我的问题而言,我不关心容器的后果。
我已经说过,我能看到的唯一问题是使用指针会花费更多时间,但我得到了能够存储 NULL 的好处。然而,正如我已经说过的,这种好处似乎并不显着,但也许是出于某种原因。这就是我的问题的本质:拥有这种灵活性是否有一些隐藏的好处,我没有看到并且希望我以后有。
如果您不理解这个问题,请阅读我在下面写的初步答案(经过一些额外的思考),看看我正在寻找的答案。
【问题讨论】:
-
我猜
STRING是一个struct,其成员跟踪已分配/使用了多少内存,以及指向所述内存的指针。但是两个答案都假设STRING是固定长度数组的typedef。您可能需要清除它。 -
你需要向我们展示
STRING结构的定义。 -
这个问题的实际答案取决于
STRING结构的定义方式。 -
有时我使用具有固定长度数组的结构,有时我使用具有指针分配数组的嵌入式结构。假设 STRING 可能有。我在这里问的是容器的设计,而不是内容。
-
@MarkBenningfield 为什么?
标签: c pointers struct datadesign