c/c++语言开发共享C中结构中的多个灵活数组?

我在c结构中有多个灵活的数组:

typedef struct { int a; float b; } Name; typedef struct { int c; int d; int e; } NIM; typedef struct { int age; int time; Name name[1]; NIM nim[1]; } EthgenSig; 

如果我们需要像这样分配内存:

 malloc(sizeof(EthgenSig) + sizeof(Name) * 10); 

如何分配内存,如果我们首先运算符name数组然后我们稍后运行nim数组,那么nim[1]将覆盖name数组,那么如何解决呢?

    由于您指出的确切原因,您不能拥有多个灵活arrays成员。

    最多,如果你需要将数据保存在同一个内存块中,你可以创建namenim指针并设置它们在分配后指向正确位置的位置(确保不破坏任何对齐约束),但最简单(也是最明智的)事情就是分别为namenim分配数组。

    这并不难做到……关键是要意识到C中的数组和指针都具有非常相似的属性。 实际上,数组访问符号与指针符号直接对应:

     a[b] == *(a + b); 

    请注意,这具有使数组名称和索引可互换的效果,因此也是如此:

     a[b] == b[a]; 

    您可以使用它来实现您想要的结果。 首先,声明一个带有两个指针元素的结构。 这提供了两个指针,用于存储两个数组的基址:

     struct two_blocks { int *x; int *y; } 

    分配此结构时,您需要为两个数组的主体分配额外的空间:

     #define X_SIZE 3 #define Y_SIZE 4 two_blocks *data = (two_blocks *)malloc(sizeof(two_blocks) + (sizeof(int) * X_SIZE) + (sizeof(int) * Y_SIZE)); 

    然后最后一步是初始化两个数组指针。 (这些表达式使用大量指针类型转换来确保指针算法以单个字节完成。指针算法通常以指向的对象大小为单位进行,以支持上面提到的数组/指针等价。 )

     data->x = (int *)(((char *)data) + sizeof(two_blocks)); data->y = (int *)(((char *)data) + sizeof(two_blocks) + X_SIZE * sizeof(int)); 

    从那里,arrays可以像你期望的那样使用:

      data->x[2] = 42; data->x[2] = 42; 

    几个观察

    当涉及到该结构的内存布局时,具有大小为1的数组与完全没有数组相同。

    你也可以这样:

     typedef struct { int age; int time; Name name; NIM nim; } EthgenSig; 

    但我认为这不是你想要的。 很难说出你真正想要的东西。 但我假设你真的想要这个:

     typedef struct { int age; int time; Name* name; NIM* nim; } EthgenSig; foo = malloc(sizeof(EthgenSig); foo.name = malloc(sizeof(Name)*10); foo.nim = malloc(sizeof(Nim) * 10); 

      以上就是c/c++开发分享C中结构中的多个灵活数组?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560512.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐