ПроблемаКопия перекрывающейся памяти возникает, когда происходит перекрытие памяти между исходным и конечным аргументом функции копирования, такой как memcpy
или strcpy
. Например, исходный и конечный аргументы strcpy
являются указателями на различные элементы в одной строке.
РискЕсли существует перекрытие памяти между исходным и конечным аргументами функций копирования, согласно стандартам C, поведение не определено.
ЗафиксироватьОпределите, является ли перекрытие памяти тем, что вы хотите. Если это так, найдите альтернативную функцию. Для образца:
Если вы используете memcpy
чтобы скопировать значения из одного места в памяти в другое, используйте memmove
вместо memcpy
.
Если вы используете strcpy
чтобы скопировать одну строку в другую, используйте memmove
вместо strcpy
, следующим образом:
s = strlen(source);
memmove(destination, source, s + 1);
strlen
определяет длину строки без терминатора строки null. Поэтому необходимо двигаться s+1
байты вместо s
байты.
Пример - Перекрывающаяся копия#include <string.h>
char str[] = {"ABCDEFGH"};
void my_copy() {
strcpy(&str[0],(const char*)&str[2]);
}
В этом примере, потому что исходный и целевой аргументы являются указателями на одну и ту же строку str
, существует перекрытие памяти между их разрешенными буферами.