首页 文章

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

提问于
浏览
126

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

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

何时使用这样的声明是有意义的?

7 回答

  • 180

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

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

  • 1

    另一个优点是它抽象了大小,因此您无需在声明此类对象的任何地方使用 [MAX] . 这也可以用

    typedef char ABC[MAX];
    

    但是你有一个更大的问题:你必须要知道 ABC 是一个数组类型(即使你在声明 ABC 类型的变量时看不到这个),否则你会因为 ABC 将会被蜇到在函数参数列表中与在变量声明/定义中表示不同的东西 .

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

  • 80

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

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

  • 2

    你可以像这样复制它 .

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

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

  • 44

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

    struct String {
        char Char[MAX];
    };
    

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

    希望它对你有用:)

  • 25

    使用这样一个 struct 的另一个好处是它 enforces type-safety 只要使用了这样的 struct ;特别是如果您有两种类型由相同大小的数组组成,用于不同的目的,这些类型将帮助您避免意外地使用数组不当 .

    如果你没有在 struct 中包装数组,你仍然可以为它声明 typedef :这具有 struct 的一些优点 - •类型声明一次,•大小自动正确,•代码的意图变为更清晰,•代码更易于维护 - 但是你失去了◦严格的类型安全性,◦能够复制和返回类型的值,◦能够在以后添加成员而不会破坏其余代码 . 对于给定类型的裸阵列,两个 typedef 仅在它们具有不同大小时才产生不同类型 . 此外,如果在函数参数中使用 typedef 而不使用 * ,则它等效于 char * ,从而大大降低了类型安全性 .

    In summary

    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
    
  • 11

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

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

相关问题