Я возвращаюсь к программированию на C через несколько лет, поэтому я думаю, что я немного заржавел, но я вижу какое-то странное поведение в своем коде.
У меня есть следующее:
memcpy(dest + (start_position * sizeof(MyEnum)), source, source_size * sizeof(MyEnum));
Где:
dest
иsource
представляют собой массивыMyEnum
разных размеров,dest
имеет длину 64 байта.source
имеет длину 16 байт.sizeof(MyEnum)
составляет4
байтsource_size
равно4
, так как внутри массива 4 перечисления.
Я зацикливаю этот код 4 раза, каждый раз продвигая start_position
, поэтому на каждой из 4 итераций цикла я получаю вызов memcpy
со следующими значениями (я уже проверил это с помощью отладчика):
memcpy(dest + (0), source, 16);
(start_position
= 0 * 4, так как размерsource
равен 4)memcpy(dest + (16), source, 16);
(start_position
= 1 * 4, так какsource
размер равен 4)memcpy(dest + (32), source, 16);
(start_position
= 2 * 4, так какsource
размер равен 4)memcpy(dest + (48), source, 16);
(start_position
= 3 * 4, так какsource
размер равен 4)
memcpy
отлично работает в первом цикле, но во втором вместо этого копирует данные в другой массив, явно выходя за пределы области памяти массива dest
, нарушая область памяти другого массива.
Поэтому я проверил арифметику указателя, происходящую внутри моей функции, и вот что я получил:
dest
адрес0xbeffffa74
dest + (start_position * sizeof(MyEnum))
равно0xbefffab4
для(start_position * sizeof(MyEnum)
=16
- Нарушенный массив находится по адресу
0xbefffab4
.
Хотя это объясняет, почему память массива нарушается, я не понимаю, как 0xbeffffa74 + 16
будет 0xbefffab4
, но я могу подтвердить, что это адрес, по которому вызывается memcpy
.
Я запускаю это на Raspberry Pi, но, насколько мне известно, это не имеет значения.