Что означает перекрытие буфера в определении функции memcpy? - PullRequest
1 голос
/ 05 августа 2020

Определение функции memcpy выглядит следующим образом -

Функция memcpy копирует байты размера из объекта, начинающегося с from, в объект, начинающегося с to. Поведение этой функции не определено, если два массива до и от перекрываются; вместо этого используйте memmove, если возможно перекрытие.

Что означает перекрытие массивов «до» и «от»? Когда мы говорим, что два массива перекрываются?

Обычно мы думаем, что что-то перекрывается, когда это относится к сценарию - массив «to» начинается с адреса 1000 и имеет размер 100 и массив «from» начинается с адреса 1050 и имеет размер 100.

Но этого не может произойти, поскольку система не выделяет память для массива «from» в 1050, поскольку массив «to» уже выделен расположение от 1000 до 1100.

1 Ответ

3 голосов
/ 05 августа 2020

Это будет перекрытие:

char arr[10];
// Code that does something
memcpy(&arr[0], &arr[3], 5);

Но это не будет:

memcpy(&arr[0], &arr[3], 2);

Если у вас есть два указателя char, p и q и вы вызываете memcpy(p, q, size), то перекрытие означает, что существует по крайней мере один байт, который принадлежит как интервалу [p,p+size], так и [q,q+size]. В приведенном выше примере это элементы arr[3] и arr[4].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...