Ошибка gcc4.7 - разыменование указателя с типом

У меня есть сторонний фрагмент кода для компиляции, ниже фрагмент кода, который не работает:

typedef struct wqe_s {
   ...
   uint8_t packet_data[96]
   ...
} wqe_t;

..
wqe_t *work = NULL;
..
wqe_t *w1 = *(wqe_t **)work->packet_data;  // ERROR

ошибка: разыменование указателя с символом типа нарушит строгие правила псевдонимов

Он скомпилирован с помощью gcc-4.7 (-Wall -Werror), я не думаю, что мне нужно настраивать флаги компилятора, лучше всего было бы исправить код.

Буду признателен за совет по этому поводу. Спасибо!


person Mark    schedule 17.03.2015    source источник
comment
Этот код и правильное решение ниже по-прежнему имеют проблему переносимости порядка следования байтов. Может быть, в реальной программе об этом позаботились, но этот отрывок - нет.   -  person Patrick Schlüter    schedule 19.03.2015


Ответы (1)


Нравится:

wqe_t *w1;
memcpy(&w1, work->packet_data, sizeof w1);
person Kerrek SB    schedule 17.03.2015
comment
@Kerrek DB, спасибо за ответ. Я не уверен, что следую вашему предложению - вы копируете [sizeof w1] байт памяти из области, на которую указывает work-›packet_data, туда, где находится указатель w1, т.е. в стек, однако в исходном коде (который gcc не в восторге) они копируют указатели. Поправьте меня если я ошибаюсь. - person Mark; 17.03.2015
comment
@Mark: Исходный код делает вид, что область памяти является объектом определенного типа T (что является недопустимым каламбуром), обрабатывая указатель на память как указатель на T и разыменовывая его. Мой код создает фактический объект типа T (так что теперь такой объект есть), а затем копирует данные в его базовое представление. (Здесь T = wqe_t*.) - person Kerrek SB; 17.03.2015