内存操作函数:
memcpy
menmove
memset
memcmp
一、memcpy – #include<string.h>
void * memcpy ( void * destination, const void * source, size_t num )
- 任意类型字符拷贝,将num个字节的值从source指向的位置直接复制到destination指向的存储块;
- 函数遇到’ \0 '不会自动停止;
模拟实现
void *memcpy(void *dest, const void *src, size_t count)
{
void *ret = dest;
assert(dest);
assert(src);
while (count--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
char dest[32] = "xbsjabcj";
char src[32] = "safdjkbfsj";
int count = 5;
printf("%s\n", memcpy(dest, src, count));
system("pause");
return 0;
}
运行结果
二、memmove – #include<string.h>
void * memmove ( void * destination, const void * source, size_t num )
- 移动内存块、将num个字节的值从source指向的位置复制到destination指向的存储块。复制就像使用中间缓冲区一样进行,从而允许目标和源重叠;
分析:
内存拷贝会产生三种常见情况:
第一种: 需要使用从前向后拷贝
第二种:不论如何拷贝都不会发生内存重叠问题
第三种:需要采用从后向前拷贝
模拟实现
void *memmove(void *dest, const void *src, size_t count)
{
void *ret = dest;
if (dest <= src || (char*)dest >= ((char*)src + count)) {
while (count--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else {
dest = (char*)dest + count - 1;
src = (char*)src + count - 1;
while (count--) {
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
char dest[32] = "xbsjabcj";
char src[32] = "safdjkbfsj";
int count = 5;
printf("%s\n", memmove(dest, src, count));
system("pause");
return 0;
}
三、memset – #include<string.h>
void * memset ( void * ptr, int value, size_t num )
- 填充内存块、将ptr指向的内存块的前num个字节设置为指定值(解释为unsigned char)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
memset(arr, 0, 10); //10 ----- 表示 10 个字节,即将 arr 数组起始的 10 个字节空间内容设置为0
return 0;
}
四、memcmp – #include<string.h>
int memcmp ( const void * ptr1, const void * ptr2, size_t num )
- 比较两个内存块
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,3,3,3 };
int ret = memcmp(arr1, arr2, 12);
//此处比较两个内存空间的 12 个字节内容,即 1,2,3 故 ret=0
printf("ret = %d\n", ret);
return 0;
}
详细代码可参考本人 GitHub 链接:
https://github.com/Coderxingchild/C-/blob/master/内存操作函数/内存操作函数/mem_.c
(博客内容为原创,有任何问题可以私聊)