const void*
означает, что реферад не будет изменен через этот указатель .
Если есть другие неконстантные указатели на тот же объект (также известный как «псевдонимы»), то, конечно, он все еще может быть изменен через них. В описанном вами сценарии этот другой указатель имеет вид dest
.
Кстати, в случае strcpy
поведение не определено, если регионы перекрываются, а в C99 подпись составляет char *strcpy(char * restrict s1, const char * restrict s2);
. Но для memmove, псевдонимы в порядке. Дав ему перекрывающиеся регионы, вы дали ему «разрешение» на изменение региона dest
, и он сделает это.