Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 嵌套字符串结构中的嵌入式与指针_C_Pointers_Struct_Datadesign - Fatal编程技术网

C 嵌套字符串结构中的嵌入式与指针

C 嵌套字符串结构中的嵌入式与指针,c,pointers,struct,datadesign,C,Pointers,Struct,Datadesign,在设计包含文本数据的结构时,我使用了以下两种基本方法: typedef struct { STRING address1; STRING address2; STRING city; STRING state; STRING zip; } ADDRESS; typedef struct { STRING* address1; STRING* address2; STRING* city; STRING* state;

在设计包含文本数据的结构时,我使用了以下两种基本方法:

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。然而,正如我已经说过的,这一好处似乎并不显著,但可能是出于某种原因。这就是我问题的本质:拥有这种灵活性是否有一些我没有看到的隐藏的好处,我希望以后能看到


如果您不理解这个问题,请阅读下面我自己写的初步答案(经过一些额外的思考后),以了解我正在寻找的答案。

嵌入式样式的一个问题是字符串需要定义为类似于
char[MAX\u char+1]
其中
MAX\u CHAR
是给定字段的悲观最大长度。指针样式允许分配正确的内存量。您提到的缺点是管理结构的认知开销要高得多。

在内存使用和malloc减少之间进行权衡

似乎取舍围绕着两个问题:1)记忆有多珍贵?2)为字符串分配固定数量的内存,限制每个字段中存储的长度是否重要


如果内存比其他任何东西都重要,那么指针版本可能会获胜。如果首选存储使用的可预测性和避免malloc,并且可以接受将名称的长度限制在某个固定数量,那么固定长度版本可能是赢家

我一直在更深入地考虑这一点,我认为在大多数情况下,指针是必要的,因为区分空白和缺失很重要。原因是当输入无效、损坏或遗漏时,需要丢失数据。例如,假设从文件读取时,文件已损坏,因此无法读取类似邮政编码的字段。在这种情况下,数据“丢失”,指针应为空。另一方面,让我们假设这个地方没有邮政编码,那么它是“空白”的。因此,NULL表示用户尚未提供信息,而blank表示用户已提供信息,并且不存在任何问题类型

因此,为了进一步说明使用指针的重要性,假设一个复杂的结构随时间以不同的异步步骤填充。在这里,我们需要知道哪些字段已被读取,哪些字段未被读取。除非我们使用指针(或添加额外的元数据),否则我们无法区分已回答的字段和回答为“无”的字段之间的区别。假设系统提示用户“邮政编码是多少?”。用户说,“这个地方没有邮政编码”。5分钟后,系统再次询问:“邮政编码是多少?”。这个用例清楚地表明,在大多数情况下,我们需要指针


在这种情况下,我应该使用嵌入式结构的唯一情况是,当容器结构被创建时,保证它具有完整的数据集。

我猜
STRING
是一个
struct
,成员跟踪分配/使用了多少内存,以及指向所述内存的指针。但这两个答案都假设
STRING
是固定长度数组的
typedef
。您可能想澄清一下。您需要向我们展示
字符串
结构的定义。这个问题的实际答案取决于
字符串
结构的定义。有时我使用具有固定长度数组的结构,有时我使用具有指针malloced数组的嵌入式结构。假设这个字符串可以有两个。我在这里问的是容器的设计,而不是内容。@MarkBenningfield Why?”…字符串需要定义为
char[MA]