Я'вэ просто прийти на еще одну базу кода на работе, где разработчики постоянно используйте адрес первого элемента структуры при копировании/сравнение/сама установка, а не структуры. Здесь'ы простой пример.
Во-первых там'ов структуру типа:
typedef struct {
int a;
int b;
} foo_t;
Потом там's в функцию, которая копирует такую структуру:
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;
Зачем использовать этот стиль?
Мое предположение: невежество или плохой дисциплины.
Этот код является небезопасным, потому что перестановка членов структуры может привести к безопасности
связи c за пределами структуры, если участник " а " уже не первый член.
Однако, это'ы предположить, что участники намеренно заказал в struct и программист хочет только, чтобы скопировать некоторые из них, начиная с А
и до конца структуры. Если это'ы так, то код может быть безопасным со следующим изменением:
memcpy(&l.a, &inp->a, sizeof(foo_t) - offsetof(foo_t, a));
Теперь члены структуры могут быть переставлены в любом порядке, и это функции memcpy
никогда не выйдет из границ.
Это'ы действительно плохая привычка. Эта структура может быть другой член добавляется, например. Это безумно неосторожное привычка и я с удивлением прочел, что кто-то будет это делать.
Другие уже отметили, эти; тот, что меня раздражает это:
struct Foo rgFoo [3];
struct Foo *pfoo = &rgFoo [0];
вместо
struct Foo *pfoo = rgfoo;
Почему оператор deref массива по индексу и адресу? Это's уже адресу, разница лишь отметить, что pfoo технически
struct Foo *const,
не
struct Foo *.
Но я использовал, чтобы увидеть первым все время.
На самом деле, есть один законный вариант использования для: построения иерархии классов.
При лечении структуры в качестве экземпляров класса, первого члена (т. е. смещение 0) обычно экземпляр супертипа... если существует супертипа. Это позволяет простой литой для перемещения между использованием подтипа и супертипа. Очень полезно.
На Даррен камня's примечание о намерении, это ожидается при выполнении ОО на языке Си.
Тюнинг любой другой case_, я бы посоветовал избегать этого узора и обращении к члену непосредственно вместо уже указанных причин.