void * memset(void *s, int i, size_t n);
将s指向的内存按字节复制为i所代表的ACKII值,长度为n。
void * memset_(void *des, int i, size_t n){
const char c = i;
char * m = static_cast<char *>(des);
while(n--)
*m++ = c;
return des;
}
把i转换成char是为了保留i的低8位,保证按字节赋值。将des变成char *也是为了按8位寻址操作。
void * memcpy(void *des, const void * src, size_t n);
将原地址的长度为n的所有字节拷贝到目标地址。函数处理上需要判断是否有地址交叉的情况。
void * memcpy(void * des, const void * src, size_t n){
const char * src_ = static_cast<const char *>(src);
char * des_ = static_cast<char *>(des);
if(des_ > src_ && des_ < src_ + n)
while(n--)
des_[n] = src_[n];
else
while(n--)
*des_++ = *src_++;
return des;
}
上边两个程序都是在面试的时候考到的,后来查了下资料,memmove()才是考虑了内存交叉的情况,而memcpy在内存交叉时不保证正确copy。