c - 在C中有效地初始化结构内部的指针

标签 c arrays pointers initialization structure

我将如何有效地初始化以下数据结构(不花费任何计算)?它由一组 struct Register 组成。每个 struct Register 的 FieldArrayPointer 指向的数组长度将不同。我将如何提取指针(使用编译器指令?)并使用它来初始化 struct Register 数组?有没有其他方法可以创建这样的数据结构(我不想使用链表)? (N可以任意大)

    struct Field
    {
        char    High;                
        char    Low;                
        char    Attribute;
    } FieldArray[L0+L1+L2...+L(N-1)];

    struct Register 
    {
       unsigned int    ResetValue;
       unsigned int    FieldArrayLength;
       struct Field    *FieldArrayPointer;
    } RegisterArray[N] =

    { ResetValue0,     L0,    <Pointer of FieldArray[0].Field>,
      ResetValue1,     L1,    <Pointer of FieldArray[L0].Field>,
      ResetValue2,     L2,    <Pointer of FieldArray[L0+L1].Field>,
      . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,
      ResetValue(N-1), L(N-1),<Pointer of FieldArray[L0+L1+..+L(N-2)].Field>
    };

   //L0,L1,L2.. and N are constant integers

最佳答案

假设 FieldArray 具有静态存储持续时间并且 L0Ln 是整数常量表达式,您可以简单地执行以下操作:

struct Register 
 {
    unsigned int    ResetValue;
    unsigned int    FieldArrayLength;
    struct Field    *FieldArrayPointer;
 } RegisterArray[N] =
 { 
   { ResetValue0,     L0,    FieldArray + 0 },
   { ResetValue1,     L1,    FieldArray + L0 },
   { ResetValue2,     L2,    FieldArray + L0 + L1 },
   ...
 };

如果手写太麻烦,您可以编写一个代码生成器来创建源代码和#include结果。

关于c - 在C中有效地初始化结构内部的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8568422/

相关文章:

c++ - 使用 c-preprocessor 自动生成函数转发器

c - 禁用优化的 c alloca 函数的奇怪汇编代码 - gcc 按常量 16 使用 DIV 和 IMUL,并进行移位?

Java Switch 语句直接使用数组默认

Java - 添加两个不相等数组的内容

javascript - 使用 array.reduce 以逗号连接字符串,但要避免额外的逗号

c++ - 将对象指针复制到动态对象数组中

c - 带 vector 的结构指针 - 段错误

c - unix 中的系统调用 : directories and files

pointers - 为什么在 Go 中将指针放在 interface{} 中会导致 reflect 丢失类型名称?

c - typedef 枚举 : Different values for one member