memcpy介绍及模拟实现:
memcpy介绍:
void* 是指可以接受任何类型的指针。
memcpy是把从 source 指针开始之后的 num 个字节的内存拷贝到 destination 指针之后的空间。
遇到‘\0’不会停止,而且memcpy不可以拷贝重叠空间,就是说 source 和 destination 不可以有重叠的空间,否则会有不确定的结果。
memcpy模拟实现:
//memcpy模拟实现
//拷贝内存,不能有重叠的内存
void* My_memcpy(void* des, const void* src, size_t num)
{while (num){*(char*)des = *(char*)src;/*(char*)des += 1;(char*)src += 1;*/des = (char*)des + 1;src = (char*)src + 1;num--;}
}int main()
{char arr1[] = "hello word";char arr2[20] = {0};//memcpy(arr2, arr1, 5);My_memcpy(arr2, arr1, 7);printf("%s\n", arr2);
}
模拟实现提醒:强制类型转换有效只有一次,像(char*)des++,这种就不能用。
VS中memcpy可以复制重叠空间,但是C语言标准中memcpy明确不可以,所以要复制重叠空间可以使用接下来的函数
memmove介绍及模拟实现:
memmove介绍:
和memcpy的差别就是memmove函数处理的源内存块和目的内存块是可以重叠的。
如果源空间和目标空间出现重叠,就使用memmove函数处理。
memmove模拟实现:
//memmove模拟实现
//支持内存重叠的内存拷贝
void* My_memmove(void* des, void* src, size_t num)
{void* ret = des;if (des <= src || (char*)des >= (char*)src + num){while (num--){*(char*)des = *(char*)src;des = (char*)des + 1;src = (char*)src + 1;}}else{des = (char*)des + num - 1;src = (char*)src + num - 1;while (num--){*(char*)des = *(char*)src;des = (char*)des - 1;src = (char*)src - 1;}}return ret;
}int main()
{char arr[] = "hello word bit";//memmove(arr + 5, arr + 8, 5);My_memmove(arr + 8, arr + 5, 3);printf("%s\n", arr);
}
模拟实现思路分享:像这种情况,就算有重叠的部分,一一复制也不会有什么问题,还有就是不重叠的时候,这两种情况不需要做特殊处理。
像这种情况,如果从头开始复制,那么重叠的部分就会消失,所以我们就可以从最后开始一一复制,这样就可以解决了。
(memcpy 和 memmove 模拟实现时,都是类型转为char* 因为只有char* 方便一个一个字节的访问)
memcmp介绍:
这个函数是一个字节一个字节的比较,并且遇到 '\0' 不会停止。
使用:
include <stdio.h>
#include <string.h>int main ()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n = 0;n = memcmp ( buffer1, buffer2, sizeof(buffer1) );if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);return 0;
}
memset介绍:
这是内存设置函数,可以把ptr指向的内存块的num个字节设置为 value
#include<stdio.h>
#include<string.h>int main()
{char str[] = "almost every programmer should know memset!";memset(str, '-', 6);printf("%s\n", str);return 0;
}
谢谢观看,谢谢点赞和关注。