繁体   English   中英

为什么在 C 中声明一个只包含数组的结构?

[英]Why declare a struct that only contains an array in C?

我遇到了一些包含以下内容的代码:

struct ABC {
    unsigned long array[MAX];
} abc;

什么时候使用这样的声明才有意义?

它允许您按值将数组传递给函数,或从函数中按值返回数组。

结构可以按值传递,这与在这些上下文中衰减为指针的数组不同。

另一个优点是它抽象了大小,因此您不必在代码中声明此类对象的任何地方都使用[MAX] 这也可以通过

typedef char ABC[MAX];

但是你有一个更大的问题:你必须意识到ABC是一个数组类型(即使你在声明类型ABC变量时看不到这一点),否则你会被ABC的事实刺痛在函数参数列表和变量声明/定义中意味着不同的东西。

另一个优点是该结构允许您稍后根据需要添加更多元素,而无需重写大量代码。

您可以复制结构并从函数返回结构。

你不能用数组来做到这一点——除非它是结构的一部分!

你可以像这样复制它。

struct ABC a, b;
........
a = b;

对于数组,您需要使用memcpy函数或循环来分配每个元素。

您可以使用 struct 来创建新类型的数据,例如string 你可以定义:

struct String {
    char Char[MAX];
};

或者您可以创建一个数据列表,您可以通过函数参数使用它或在您的方法中返回它。 struct 比数组更灵活,因为它可以支持一些运算符,例如 = 并且您可以在其中定义一些方法。

希望对你有用:)

使用这样的的另一个优点struct是,它强制类型安全只要这样的struct被使用; 特别是如果您有两种类型由用于不同目的的相同大小的数组组成,这些类型将帮助您避免意外地不恰当地使用数组。

如果你没有在包装一个数组struct ,你仍然可以声明typedef吧:这个有一定的优势struct - •类型声明一次,•大小自动修正,•意图的代码变得更清晰, • 并且代码更易于维护——但你失去了 ◦ 严格的类型安全性, ◦ 复制和返回类型值的能力,以及 ◦ 稍后添加成员而不破坏其余代码的能力。 给定类型的裸数组的两个typedef仅在大小不同时产生不同的类型。 此外,如果您在函数参数中使用没有*typedef ,则它等效于char * ,从而大大降低了类型安全性。

总之

typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char   A_c_t[113];                   // Partial type-safety, not assignable

A_s_t          v_s(void);     // Allowed
A_c_t          v_c(void);     // Forbidden

void           s__v(A_s_t);     // Type-safe, pass by value
void           sP_v(A_s_t *);   // Type-safe
void           c__v(A_c_t);     // UNSAFE, just means char * (GRRR!)
void           cP_v(A_c_t *);   // SEMI-safe, accepts any array of 113

一个结构可以包含模拟 OOP 内存管理范例的一些优点的数组初始化、复制和 Fini 函数。 事实上,很容易扩展这个概念来编写一个通用的内存管理实用程序(通过使用 sizeof() 结构来确切知道正在管理多少字节)来管理任何用户定义的结构。 许多用 C 编写的智能生产代码库大量使用这些,并且通常从不使用数组,除非它的范围非常局部。

事实上,对于嵌入在结构中的数组,您可以随时执行其他“智能操作”,例如在您想要访问该数组时进行边界检查。 同样,除非数组范围非常有限,否则使用它并在程序之间传递信息是一个坏主意。 迟早,你会遇到让你彻夜难眠并毁了你周末的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM