Лундин предоставил хороший ответ
Этот ответ не является решением.Это скорее предупреждение о чем-то обычном, что вы не должны делать.Может быть заманчиво сделать что-то подобное, но вы не должны.
double *ptr = &featureSetOfPolledData;
for(int i=0; i<53; i++) copy[i] = ptr[i];
Это может сработать, но вызывает неопределенное поведение.
Так почему это вызывает неопределенное поведение?Это не совсем очевидно.Члены в структуре гарантированно будут в том же порядке, в котором вы их написали.Заполнение может происходить в структуре, но для двойников крайне маловероятно, что любой компилятор будет использовать заполнение.
Если честно, я не помню деталей, но это связано с тем, что доступ к полям осуществляется черезуказатель таким образом просто является неопределенным поведением в стандарте C, и ЛЮБОЕ неопределенное поведение может нарушить ваш код.Особенно, если вы включаете оптимизацию.
Лундин (снова тот же замечательный парень) написал это в комментариях ниже:
Это UB, потому что структура структуры не может содержатьтакое же выравнивание, как у double (так будет и в этом случае на практике), но также потому, что featureSetOfPolledData не является массивом.Часть стандарта - аддитивные операторы. C17 6.5.6. «Для целей этих операторов указатель на объект, который не является элементом массива, ведет себя так же, как указатель на первый элемент массива длиной один.с типом объекта в качестве его типа элемента. "И тогда вы выходите за пределы вашего массива из 1 элемента.Компилятору разрешается предполагать, что вы не обращались к данным.
C17 6.3.2.3 дает специальное исключение, которое позволяет разбирать большие типы с помощью символьных типов.Так что просто для записи, вы действительно можете сделать это хорошо определенным, используя символьный тип, увеличивая его на sizeof (double) на каждой итерации, а затем преобразовывая в double.Как
for(uint8_t* ptr = &featureSetOfPolledData;
ptr < (uint8_t*)&featureSetOfPolledData + sizeof(double[54]);
ptr += sizeof(double)) {
double d = *(double*)ptr;
/* Put the copying code here */
}
Полное безумие, но четко определенное