问题描述
我刚刚来到工作中的另一个代码库,开发人员在复制/比较/设置时始终使用结构的第一个元素的地址,而不是结构本身.这是一个简单的例子.
首先有一个结构类型:
typedef struct { int a; int b; } foo_t;然后有一个函数,使这种结构的副本:
void bar(foo_t *inp) { foo_t l; ... memcpy(&l.a, &inp->a, sizeof(foo_t)); ... }
我本身不会以这种方式写入memcpy,我开始怀疑原始开发人员在c中没有完全掌握指针和结构.然而,现在我在两个中看到了这一点不相关的代码基础,没有普通开发人员,所以我开始怀疑自己.
为什么人们想要使用这种风格?
推荐答案
没有人应该这样做. 如果您重新排列了结构成员,则遇到麻烦.
其他推荐答案
而不是那样:
memcpy(&l.a, &inp->a, sizeof(foo_t));
你可以做到:
memcpy(&l, inp, sizeof(foo_t));
虽然它可能是危险和误导性,但两个陈述实际上在这里做了同样的事情,因为C保证在第一结构成员之前没有填充.
但最好的只是使用简单的赋值运算符复制结构对象:
l = *inp;
为什么人们想要使用此样式?
我的猜测:无知或糟糕的纪律.
其他推荐答案
一个人不会.如果您在STRACH中移动a或在其之前插入成员,则会引入内存粉碎错误.