"const void*"在memmove中意味着什么?

Alc*_*ott 10 c const strcpy memmove

memmove/memcpy/strcpy原型中的第二个arg是类似的:例如:

void *memmove(void *dest, const void *src, size_t n); //const void*
char *strcpy(char *dest, const char *src); //const char*
Run Code Online (Sandbox Code Playgroud)

但显然,如果dest和src重叠,那么src的内容会被改变,违反const void/char*?

Ste*_*sop 20

const void*表示不会通过该指针修改referand .

如果存在指向同一对象的其他非常量指针(也称为"别名"),那么当然它仍然可以通过这些指针进行修改.在您描述的场景中,其他指针是dest.

顺便说一下,strcpy如果区域重叠,则行为未定义,而在C99中,签名是char *strcpy(char * restrict s1, const char * restrict s2);.但是对于memmove,别名是可以的.通过赋予它重叠的区域,你已经"允许"修改dest区域,它就会这样做.


Pra*_*ian 7

参数被标记const void *为表示memmove永远不会修改src使用该指针指向的内存.如果发生重叠,则使用dest指针而非src指针修改内存,因此不会违反保证.