目录
内存函数须包含头文件<string.h>
C语言官方解释:<cstring> (string.h) - C++ Reference (cplusplus.com)
一、memcpy
void * memcpy ( void * destination, const void * source, size_t num );
- 功能:从source的位置开始向后复制num个字节的数据到destination指向的内存位置。可以复制任何类型的数据。
- 注意事项:指定的两个内存空间不能重叠
- 模拟实现:
void my_memcpy(void* dest, void* source, size_t num)
{
int i = 0;
while (num--)
{
*((char*)source + i) = *((char*)dest + i);
i++;
}
}
二、memmove
void * memmove ( void * destination, const void * source, size_t num );
- 功能:用来复制两块内存空间重叠的数据的复制
- 模拟实现详解:
- 为什么memcpy的写法不能满足内存空间重叠的情况?
- 除了直接暴力复制一份的方式外。试图采用从后往前的解决方法,但是仍存在问题:
- 所以本文采用先判断后两者混合的方式来实现
void my_memmove(void* dest, void* source, size_t num)
{
if (dest <= source || (char*)dest >= ((char*)source + num))
{
while (num--)
{
*(char*)dest = *(char*)source;
dest = (char*)dest + 1;
source = (char*)source + 1;
}
}
else
{
dest = (char*)dest + num - 1;
source = (char*)source + num - 1;
while (num--)
{
*(char*)dest = *(char*)source;
dest = (char*)dest - 1;
source = (char*)source - 1;
}
}
}
三、memset
void * memset ( void * ptr, int value, size_t num );
- 功能:设置指定num个字节内存的值为value
- 注意事项:函数是以字节为单位设置的(16进制),不是以元素为单位设置。
- 模拟实现:
void my_memset(void* ptr, int value, size_t num)
{
int i = 0;
while (num--)
{
*((char*)ptr + i) = value;
i++;
}
}
四、memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
- 功能:比较两个内存块指定字节的大小
- 返回值:小于-返回负数;大于-返回正数;等于-返回0
- 模拟实现:
int memcmp(const void* ptr1, const void* ptr2, size_t num)
{
while (*((char*)ptr1) == *((char*)ptr2))
{
ptr1 = (char*)ptr1 + 1;
ptr2 = (char*)ptr2 + 1;
num--;
if (num==0)
{
return 0;
break;
}
}
return *((char*)ptr1) - *((char*)ptr1);
}