通过指针初始化结构

时间:2019-02-11 20:58:58

标签: c++ pointers struct

如何使用此mxt_config *cfg指针分配存储在数组中的值?主要思想是分配一个数组值,以将指针移至该结构的下一个元素。

typedef struct
{
  unsigned char F_Id;
  unsigned char V_Id;
  unsigned char Ve; 
  unsigned char Bu; 
  unsigned char Mat;
}InfoId_t;

struct mxt_config 
{
  InfoId_t id;
  unsigned char info_crc;
  unsigned char config_crc;
};

int main()
{
    unsigned char line1[7] = {0x1,0x2,0x3, 0x4, 0x5,0x6, 0x7};
    mxt_config  *cfg = NULL;
    mxt_config  objcfg;
    cfg = &objcfg;

    for (int i = 0; i < 7; i++) 
    {
        (unsigned char*)&cfg->id + i = line1[i];
    }
}

任何帮助都会非常有用,因为可以肯定有问题,但是我看不到什么。

先谢谢

1 个答案:

答案 0 :(得分:0)

这种方法有些错误:尽管标准确保结构成员将按预期顺序存储,但不能保证它们是连续的(可以在某些成员之间添加一些填充) )。

  

[class.mem] / 17:具有以下内容的类的非静态数据成员   分配相同的访问控制,以便以后的成员拥有   类对象中的更高地址。 (...)   实施对齐要求可能会导致两个相邻成员   不得彼此立即分配;所以可能   虚拟功能和虚拟库管理空间的要求   课程。

所有成员均为unsigned char的事实可以降低风险(例如,不存在对齐问题,不存在字节序意外),但不能保证100%工作。您至少应该断言该结构具有预期的大小,以避免出现意外情况:

assert(sizeof(mxt_config)==7);

如果尽管您希望继续存在风险,则需要更正代码:

for (int i = 0; i < 7; i++) 
{
   *((unsigned char*)&cfg->id + i) = line1[i];     
}

或者,您可以选择算法std::copy()

copy (line1,  line1+7,  reinterpret_cast<unsigned char*>(&cfg->id));