memcpy的使用和模拟实现
void * memcpy ( void * destination, const void * source, size_t num );
从函数的参数来看,memcpy函数是从source的位置开始向后复制num个字节的数据(注意是num个字节)到destination指向的内存位置,是从内存直接操作的,如果是进行字符串的复制时,我们都知道,字符串的结束标志是’\0’ 但memcpy函数遇到’\0’并不会停止,这一点也需要注意。
下面我们具体实现一下
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
可以看出,当我们复制20个字节时(也就是五个整型元素),arr2数组前五个都被赋值了,而之后的元素依然是初始化的0.
接下来我们看一下字符的例子:
可以看出,'\0’也被复制了下来
接下来我们简单模拟一下memcpy函数:
void* my_memcpy(void* dest, void* src, size_t num) {
assert(dest && src);
void* ret = dest;
while (num--) {
*(char*)dest = *(char*)src;
src = (char*)src+1;
dest = (char*)dest+1;
}
return ret;
}
memmove的使⽤和模拟实现
void * memmove ( void * destination, const void * source, size_t num );
我们发现memmove和memcpy的参数一样,其实使用方法也是一样的,二者最大的区别就是,memmove可以处理的源内存块和⽬标内存块是可以重叠的,我们下面举个例子就好理解了。
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 5*sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
其实也就是自己复制自己,然后自己修改自己。
接下来我们看模拟实现:
void* my_memove(void* dest, const void* src, size_t num) {
assert(dest && src);
void* ret = dest;
if (dest < src) {
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else {
while (num--) {
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
memset的使用
void * memset ( void * ptr, int value, size_t num );
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容,一般情况下,我们常用与将数组值全部设为0或-1,其他值并不常设置。这个函数在之前简单提过怎么使用的,链接: 可以看上一篇博文。
这次我们看下设置字符的例子:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "hello world";
memset (str,'x',6);
printf(str);
return 0;
}
memcmp的使用
这是一个内存比较的函数
memcmp函数返回一个整数值,表示比较结果:
如果两个内存区域的前n个字节完全相同,则返回0。
如果从第一个字节开始比较,s1指向的内存区域小于(大于)s2指向的内存区域,则返回一个小于(大于)零的值。
具体来说,memcmp首先将s1指向的内存区域的第一个字节的值减去s2指向的内存区域的第一个字节的值,若差值为0,则继续比较下一个字节,直到比较完n个字节或遇到不相等的字节为止。
因此,memcmp不仅可以用于比较字符串,还可以用于比较任意类型的内存区域,只要这些内存区域的内容是可以按字节进行比较的。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello, World!";
char str2[] = "Hello, Universe!";
size_t n = 5; // 我们将比较前5个字节
int result = memcmp(str1, str2, n);
if (result == 0) {
printf("str1和str2的前%zu个字节相同。\n", n);
}
else if (result < 0) {
printf("str1的前%zu个字节小于str2的对应字节。\n", n);
}
else {
printf("str1的前%zu个字节大于str2的对应字节。\n", n);
}
return 0;
}