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

时间:2011-08-06 11:43:34

标签: c arrays coding-style struct

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

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

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

6 个答案:

答案 0 :(得分:182)

它允许您通过值将数组传递给函数,或者通过函数的值返回它。

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

答案 1 :(得分:82)

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

来实现
typedef char ABC[MAX];

但是你有一个更大的问题:你必须要知道ABC是一个数组类型(即使你在声明ABC类型的变量时也看不到这个)或者其他你会被ABC在函数参数列表和变量声明/定义中表示不同的事实所困扰。

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

答案 2 :(得分:45)

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

你不能用数组做 - 除非它是结构的一部分!

答案 3 :(得分:26)

你可以像这样复制它。

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

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

答案 4 :(得分:11)

您可以使用struct来制作新类型的数据,例如字符串。你可以定义:

struct String {
    char Char[MAX];
};

或者您可以创建列表数据,您可以通过函数参数将其用于其中,也可以在方法中将其返回。结构比数组更灵活,因为它可以支持像=这样的运算符,你可以在其中定义一些方法。

希望它对你有用:)

答案 5 :(得分:1)

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

事实上,对于嵌入在结构中的数组,您可以执行其他“智能操作”,例如在您想要访问此数组时进行绑定检查。同样,除非阵列范围非常有限,否则使用它并跨程序传递信息是一个坏主意。迟早,你会遇到虫子,让你夜不能寐,毁了周末。