【问题标题】:How do I fill an array inside a struct using offsetof() and pointers in C如何使用 C 中的 offsetof() 和指针填充结构内的数组
【发布时间】:2019-09-16 05:35:48
【问题描述】:

我有一个结构

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))

【问题讨论】:

  • 我假设你在谈论 C 编程语言?
  • 是的,它是 C 语言

标签: c arrays struct offset


【解决方案1】:

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

以下代码片段声明了结构和 5 个ints 的数组。然后使用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* 的原因。

【讨论】:

    【解决方案2】:

    如果我理解您的问题,您希望将整数复制到大小为 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];
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多