C语言内存函数
针对内存块处理的
内存块=一块内存,就好像面包块=一块面包

模拟实现memcpy
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
• 这个函数在遇到 '\0' 的时候并不会停下来。
• 如果source和destination有任何的重叠,复制的结果都是未定义的。
c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, void* str, size_t num)
{
int i = 0;//遍历元素
void* ret = dest;//目的地,记录初始位置
assert(dest && str);
while (num--)//复制num后面的数
{
*(char*)dest= *(char*)str;//强制类型转换
dest= (char*)dest + 1;//注意++的写法
str = (char*)str + 1;
}
return ret;
}
int main()
{
char arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
char arr2[20] = { 0 };
//将arr1中的3 4 5 6 7 拷贝放到arr2中
my_memcpy(arr2, arr1+2, 17);
return 0;
}


模拟实现memmove


memcpy也可以对重叠内存的部分进行拷贝
c
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
if (dest < src)//从前到后拷贝
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)+1;
}
}
else //从后到前拷贝
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
return ret;
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d", arr1[i]);
}
return 0;
}
memset函数的使用
memset的使用
c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "hello world";
memset(arr+6,'x',5);
printf("%s\n", arr);
return 0;
}
运行结果

memset 是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
memcmp函数的使用
• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
• 返回值如下:

c
int main()
{
// //0000 0000 00000000 00000000 00000001
// //0x00 00 00 01
int arr1[] = { 1,2,3,4,5 };
// //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
int arr2[] = { 1,2,3,6,5 };
// //01 00 00 00 02 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00
//
int ret = memcmp(arr1, arr2, 13);
//
printf("%d\n", ret);
return 0;
}
00 02 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00
//
int ret = memcmp(arr1, arr2, 13);
//
printf("%d\n", ret);
return 0;
}