内存函数
memset
void *memset( void *dest, int c, size_t count )
{
void *start = dst;
while (count--)
{
*(char *)dst = (char)val;
dst = (char *)dst + 1;
}
return(start);
}
注意:
memset内部实现时是一个一个字节进行赋值的,因此无法将其初始化成任意值,只能将其初始化为0或-1。
memcpy
void *memcpy(void *dest, const void *src, size_t count)
{
assert(dest&&src);
void *ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
注意:
函数memcpy从source的位置开始向后复制count个字节的数据到destination的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
memmove
void *memmove(void *dest, const void *src, size_t count)
{
assert(dest&&src);
void *ret = dest;
if (dest < src)//从头到尾移动
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else//从尾到头移动
{
while (count--)
{
*((char*)dest + count) = *((char*)src + count);//此时count已经-1了
}
}
return ret;
}
注意:
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
memcmp
比较从ptr1和ptr2指针开始的num个字节
int memcmp(void *suf1, void *suf2,size_t count)
{
assert(suf1&&suf2);
while (count--)
{
if (*(char*)suf1 != *(char*)suf2)
{
return *(char*)suf1 - *(char*)suf2;
}
suf1 = (char*)suf1 + 1;
suf2 = (char*)suf2 + 1;
}
return 0;
}
Return Value | Relationship of First count Bytes of buf1 and buf2 |
< 0 | buf1 less than buf2 |
0 | buf1 identical to buf2 |
> 0 | buf1 greater than buf2 |