如何在C中使用offsetof()和指针填充结构内部的数组

时间:2019-04-26 17:02:26

标签: c arrays struct offset

我有一个结构

typedef struct _st_L3 {
   int e;
   int f;
   int bb[5];
   int g;
} st_L3;

我正在使用offsetof()获取所有元素的偏移量。

如何使用memcpy,offsetof()并知道基本结构的地址将值复制到bb [5]?

我尝试过:

从0-4开始

memcpy((base_address_of_st_L3 + offset + sizeof(int)*i ), &int_data, sizeof(int))

2 个答案:

答案 0 :(得分:1)

  

如何使用memcpy,offsetof()并知道基本结构的地址将值复制到bb [5]?

以下代码片段声明了结构和5个int的数组。然后使用memcpyint's复制到结构的bb成员中。我将指针投射到void*,以尝试“概括”该示例。

int main() {
     st_L3 var;
     int array[5]; // int_data
     void *pnt = &var; // base_address_of_st_L3 

     // using operator `[]`
     memcpy(&((char*)pnt)[offsetof(st_L3, bb)], array, sizeof(int) * 5);

     // using pointer arithmetics
     memcpy(((char*)pnt) + offsetof(st_L3, bb), array, sizeof(int) * 5);

     // one variable at a time
     for (int i = 0; i < 5; ++i) {
         memcpy(&((char*)pnt)[offsetof(st_L3, bb) + i], &array[i], sizeof(int));
     }
}

请注意,对void*指针进行指针算术是无效的。这就是为什么需要强制转换为char*的原因。

答案 1 :(得分:1)

如果我理解您的问题,您希望将整数复制为5的整数数组吗?

您可以这样操作:

((st_L3*)base_address_of_st_L3)->bb[0] = int_data;

当然,bb仍将剩下四个将不初始化的整数。

或者您是说int_data也是由五个整数组成的数组?

{
  int i;

[... snipped ...]

  for(i = 0; i < 5; i++)
  {
    ((st_L3*)base_address_of_st_L3)->bb[i] = int_data[i];
  }
}