[英]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.