目录

C语言内存函数

C语言内存函数

1.memcpy的使用和模拟实现

void * memcpy(void * destination, const void * source, size_t num);

函数memcpy从source的位置考试向后复制num个字节的数据到destination指向的内存位置。 这个函数在遇到’ \0 ‘的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。 注:只关注要拷贝的数据在哪里,要存放到哪里,拷贝几个字节,至于内存中存放什么数据,什么类型的数据,都不重要!!! https://i-blog.csdnimg.cn/direct/b7b338c16ec446c391c94e1d59d4a78d.png memcpy的模拟实现

void* my_memcpy(void* dest, const void* scr, size_t num)
{
assert(dest && scr);
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)scr;
dest = (char*)dest + 1;
scr = (char*)scr + 1;
}
return ret;
}

https://i-blog.csdnimg.cn/direct/62d7f91806ca462c92c5839579acc29c.png

2.memmove的使用和模拟实现

void * memmove(void * destination, const void * source, size_t num);

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 如果源空间和目标空间出现重叠,就得使用memmove函数处理。 https://i-blog.csdnimg.cn/direct/897d7f1be4e4444fbcba34b3f88e125c.png memmove的模拟实现

void* my_memmove(void* dest, const void* scr, size_t num)
{
assert(dest && scr);
void* ret = dest;
if (dest < scr)
{
while (num--)
{
*(char*)dest = *(char*)scr;
dest = (char*)dest + 1;
scr = (char*)scr + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)scr + num);
}
}
return ret;
}

https://i-blog.csdnimg.cn/direct/665471ba3dc1482896e8706c02937214.png

3.memset的使用

void * memset(void * ptr, int value, size_t num)

memset是用来设置内存的,将内存的值以字节为单位设置成想要的内容。 https://i-blog.csdnimg.cn/direct/389c262497ec499c8a00ae59c2785b11.png

4.memcmp函数的使用

int memcmp(const void * ptr1, const void * ptr2, size_t num);

比较从ptr1和ptr2指针指向的位置开始,向后的num个字节 返回值如下: https://i-blog.csdnimg.cn/direct/f02187be38ed4b5c8e0586580b44cdae.png https://i-blog.csdnimg.cn/direct/d96f3909971147d998519b1efea6a536.png