Безопасно ли использовать memcpy для сдвига элементов в массиве?

Допустим, у меня есть целочисленный массив, содержащий мусор и данные. Я хочу сдвинуть этот массив так, чтобы данные находились в начале массива.

Current:
[?, ?, ?, ?, 1, 1, 1, 1, 1]
 ----------  -------------
 JUNK        DATA

Desired:
[1, 1, 1, 1, 1, ?, ?, ?, ?]
 -------------  ----------
 DATA           JUNK

Безопасно ли использовать memcpy для выполнения этого сдвига?

memcpy(my_array, my_array + 4, 5)

Меня интересует порядок копирования memcpy, возможно, искажающий сдвиг данных.

Примечание. Прежде чем кто-либо спросит, я работаю с устаревшим кодом. Я думаю, что истинное решение моей проблемы требует кругового буфера, чтобы мне не приходилось перемещать данные внутри массива.


person Izzo    schedule 07.03.2021    source источник


Ответы (1)


Вам не нужно долго читать описание memcpy, чтобы понять, что вы не можете перекрывать источник и место назначения.

Вот стандарт:

7.21.2.1 Функция memcpy

Описание

2 Функция memcpy копирует n символов из объекта, на который указывает s2, в объект, на который указывает s1. Если копирование происходит между перекрывающимися объектами, поведение не определено.

person Paul Hankin    schedule 07.03.2021
comment
Вы можете использовать memmove, когда источник и место назначения перекрываются. - person icebp; 07.03.2021