通过指针初始化结构

Posted

技术标签:

【中文标题】通过指针初始化结构【英文标题】:initializing an struct by pointer 【发布时间】:2019-02-11 20:58:58 【问题描述】:

如何使用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];
    

任何帮助都会很好,因为肯定有问题,但我看不出是什么。

提前致谢

【问题讨论】:

执行您所要求的“正确”方法是:std::memcpy(cfg, line_1, sizeof(line_1)),但如果我正在对此进行代码审查,我会先问很多问题,然后再让这个想法飞起来地点。 @Frank 即使这样也可能不正确。他们需要资产sizeof(mxt_config) == sizeof(line1) 简短的回答是:不要这样做。假设结构的内存布局是什么是不安全的。相反,编写一个例程,从 unsigned-char 数组中的相应字节按名称显式设置结构的每个成员,以便编译器知道做正确的事情。 【参考方案1】:

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

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

【讨论】:

以上是关于通过指针初始化结构的主要内容,如果未能解决你的问题,请参考以下文章

C语言-结构体

Golang入门到项目实战 golang结构体指针

结构体中定义函数指针

函数指针初始化

如何初始化指向结构的指针数组?

在结构中初始化函数指针[重复]