Linux memmove函数中为何引入const char *s而非直接使用src?
关于Linux memmove函数中额外定义
s的疑问解答 在查看Linux源码的memmove函数时,发现函数体内定义了const char *s并将其赋值为src参数,疑惑为何不直接使用src,而要额外定义并使用s?以下是该函数的代码:
void *memmove(void *dest, const void *src, size_t count) { char *tmp; const char *s; if (dest <= src) { tmp = dest; s = src; while (count--) *tmp++ = *s++; } else { tmp = dest; tmp += count; s = src; s += count; while (count--) *--tmp = *--s; } return dest; }
原因解析:
- 类型适配,简化操作:
src的类型是const void *,这类指针不支持直接做算术运算(比如++、+=)和解引用操作,必须先强制转换为具体类型。而s被定义为const char *,可以直接进行指针移动和取值,避免了重复的类型转换,让代码更简洁。 - 保护原参数的原始指向:虽然
src是const修饰的指针,但这里的const只限制了不能修改它指向的内容,指针变量本身是可以被修改的。如果直接对src做src += count这类操作,会改变它的指向,要是后续有需要用到原始src的场景就无法实现了。用s作为src的副本,就可以随意修改s的指向,完全不影响原参数。 - 代码结构对称,提升可读性:函数分为正向拷贝和反向拷贝两个分支,两个分支都用
s来处理源指针,变量名统一,逻辑结构对称,阅读代码时不用切换思路去适应不同的变量,降低理解成本。
内容的提问来源于stack exchange,提问作者Atti
相关产品推荐
相关产品推荐

