LINUX.ORG.RU

Массивы и приведение типов в C


0

0

Доброго времени суток!

Предположим, есть два массива, объявленных следующим образом:
unsigned char byte_array[N];
unsigned short word_array[N/2];

в word_array есть какие-то полезные данные, которые затем копируются в byte_array:
memcpy(byte_array, word_array, N);

затем идет такая работа с byte_array:
unsigned short word = *((unsigned short *)&byte_array[4]);

насколько я понимаю, в результате в word будет записано то же, что лежит в word_array[2] (я правильно понимаю?).

Но в одном примере кода мне попалась на глаза такая конструкция:
unsigned short word = ((unsigned short)(byte_array[4]));

что в word запишется в этом случае?
Мне кажется, что из byte_array возьмется 5-й байт, который будет затем приведен к short (старший байт при этом окажется нулевым),
а затем результат будет записан в переменную word. Я ошибаюсь?

anonymous

Вы, батенька, извращенец. Лучше вообще такой код не используйте. Но если надо, то предлагаю так:

unsigned short word = ((unsigned short *)byte_array)[2];

Вернет то, что было в word_array[2].

anonymous
()

Нет, не ошибаешься.

eXire ★★
()

> memcpy(byte_array, word_array, N);

Осторожнее с такими строками, так можно и проблему несовместимости с разным парядком байтов на разных машинах получить.

http://ru.wikipedia.org/wiki/Порядок_байтов

anonymous
()
Ответ на: комментарий от anonymous

Ну, я упростил ситуацию, чтобы не вдаваться в подробности, и получилось действительно несколько странно.
В рассматриваемом мной случае извне в программу приходят массивы элементов разного типа в универсальном контейнере:
struct Array
{
    unsigned num_items;        // число элементов
    unsigned item_type;        // код типа элемента
    unsigned char items[1];    // сам массив
}

В программу приходит указатель на такую структуру, который инициализируется так:
(struct Array *) malloc(sizeof(struct Array) + item_size * num_items);

Судя по описанию, элементы такого массива заполняются примерно так:
*((ITEM_TYPE *)&array->items[index * item_size]) = value;
или
memcpy((ITEM_TYPE *)&array->items[index * item_size], &value, sizeof(ITEM_TYPE));

А мне, соответственно, надо эти элементы извлечь.
Почему-то в описании был такой пример извлечения:
ITEM_TYPE value = ((ITEM_TYPE)(array->items[index * sizeof(ITEM_TYPE)]));
Что, как мне кажется, неправильно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.