通过指针初始化结构
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));
【讨论】:
以上是关于通过指针初始化结构的主要内容,如果未能解决你的问题,请参考以下文章