Я сталкиваюсь со странным поведением при приведении (или даже более разыменовании) отдельных элементов из массива в один арифметический тип.
Вот сокращенный контрольный пример:
void test1()
{
unsigned char test[10] = {0};
unsigned long i=0xffffffff;
*((unsigned long *)(&test[3])) = i;
int it;
for ( it = 0 ; it < 10 ; it++ )
{
printf("%02x ", test[it]);
}
}
void test2()
{
unsigned char test[10] = {0};
unsigned char test2[10] = {0};
test[2]=0xFF;
test[3]=0xFF;
*((unsigned short *)(&test2[1])) = *((unsigned short *)(&test[2]));
int it;
for ( it = 0 ; it < 10 ; it++ )
{
printf("%02x ", test2[it]);
}
}
Подробно это в основном это выражение:
*((unsigned short *)(&test2[1]))
Я получаю нарушения прав доступа на некоторых других платформах (в основном, на встраиваемых платформах, таких как PIC24).
Итак, мой вопрос: соответствует ли это C? Я не могу найти ничего в C-стандарте, но, возможно, я только слепой.
Знаете ли вы какие-либо альтернативы, выполняющие эту операцию без такого приведения (циклическое копирование / разворачивание байт в байт и т. Д. Не предусмотрено!) И где мне не нужно знать текущий порядок байтов платформы?
Спасибо!