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

我偶然发现一些包含以下内容的代码:

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

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

8459 次浏览

它允许您通过值将数组传递给函数,或者通过值从函数中获取数组。

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

可以复制 struct 并从函数返回 struct。

您不能使用数组进行此操作——除非它是 struct 的一部分!

你可以这样复制。

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

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

另一个优点是它抽象出了大小,所以无论在哪里声明这样的对象,都不必在代码中使用 [MAX]。这也可以通过

typedef char ABC[MAX];

但是接下来你有一个更大的问题: 你必须意识到 ABC是一个数组类型(即使你在声明类型为 ABC的变量时看不到这一点) ,否则你会因为 ABC在函数参数列表和变量声明/定义中的含义不同而感到困扰。

另一个优点是,如果需要,结构允许您稍后添加更多元素,而不必重写大量代码。

您可以使用 struct 创建一个新类型的数据,比如 绳子。您可以定义:

struct String {
char Char[MAX];
};

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

希望对你有用:)

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

实际上,对于嵌入在结构中的数组,您可以在任何想要访问该数组的时候执行其他“智能操作”,例如绑定检查。同样,除非数组作用域非常有限,否则使用它并在程序之间传递信息是一个糟糕的主意。迟早有一天,你会遇到虫子,它们会让你夜不能寐,毁了你的周末。

使用这样的 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