что означает "const void *" в memmove? - PullRequest
       59

что означает "const void *" в memmove?

10 голосов
/ 16 сентября 2011

Второй аргумент в прототипах для memmove / memcpy / strcpy похож: Например:

void *memmove(void *dest, const void *src, size_t n); //const void*
char *strcpy(char *dest, const char *src); //const char*

Но, очевидно, если dest и src перекрываются, то содержимое src будет изменено, нарушая const void / char *?

Ответы [ 4 ]

20 голосов
/ 16 сентября 2011

const void* означает, что реферад не будет изменен через этот указатель .

Если есть другие неконстантные указатели на тот же объект (также известный как «псевдонимы»), то, конечно, он все еще может быть изменен через них. В описанном вами сценарии этот другой указатель имеет вид dest.

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

7 голосов
/ 16 сентября 2011

Аргумент помечен const void *, чтобы указать, что memmove никогда не изменит память, на которую указывает src, используя этот указатель. Если происходит перекрытие, память модифицируется с помощью указателя dest, а не указателя src, поэтому гарантия не нарушается.

4 голосов
/ 16 сентября 2011

Как указано выше, memove не изменяет содержимое памяти через указатель «src», а через указатель «dest».

Константа относится к тому, как используются указатели, она не добавляет никакой памятиprotection.

Если оба указателя указывают на перекрывающуюся область памяти, то может произойти все что угодно, поскольку не определено, будет ли копирование начинаться с «src», увеличиваться или начинаться с «src + n» и уменьшаться.

4 голосов
/ 16 сентября 2011

Это означает, что memmove гарантирует, что не будет напрямую изменять память, указанную src.

Конечно, если два блока перекрываются memmove изменит так называемую "постоянную" память. const это контракт, прикрепленный к имени. Нельзя сделать реальную память доступной только для чтения.

...