以mem开头的函数,其操作以字节为基本单位,与类型无关(因为参数都为void*,即接收所有类型)
- void 不能定义变量,因为不同的编译器中规定的大小不同
- void*可以定义变量,它也是指针,大小为4或8,但不能解引用,解引用后为void,就不知道指针指向的是谁了
- void*一般用来用来传值,可以接收任意类型,常见用来接收地址类型
memcpy 内存拷贝
void *my_memcpy(void *dst, void *src, int num)
{
assert(dst);
assert(src);
//得有一个容器
char *dst_p = (char*)dst;//强转成char* 因为以字节为单位,char 占一个字节
char *src_p = (char*)src;
//拷num个字节,循环一次拷一个
while (num--)
{
*dst_p = *src_p;
dst_p++, src_p++;
}
return dst;
}
int main()
{
char *arr = "hello world";
char arr1[32];
my_memcpy(arr1, arr, strlen(arr)+1);//按字节拷贝 +1是给结尾带'\0'
system("pause");
return 0;
}
memset 将内存中每个字节的内容设置为特定的值
void *my_memset(void *arr, int value, size_t num)
{
assert(arr);
char *dst = (char*)arr;
size_t i = 0;
for (; i < num; i++)
{
*(dst + i) = (char)value;
}
return arr;
}
int main()
{
int arr2[] = { 1, 2, 3, 4, 5 };
int sz = sizeof(arr2) / sizeof(arr2[0]);
my_memset(arr2, 0, sizeof(arr2));//置为0
for (int i=0; i < sz; i++)
{
printf("%d", arr2[i]);
}
printf("\n");
system("pause");
return 0;
}
memcmp 内存比较
int my_memcmp(const void *dst,const void *src, int num)
{
assert(dst);
assert(src);
char *p1 = (char*)dst;
char *p2 = (char*)src;
while (num&&*p1 == *p2)
{
p1++;
p2++;
num--;
}
if (*p1 > *p2)
{
return 1;
}
else if (*p1<*p2)
{
return -1;
}
return 0;
int main()
{
const char *a1 = "abcdef";
const char *a2 = "def";
int ret = my_memcmp(a1, a2, 3);
printf("%d\n", ret);
system("pause");
return 0;
}
memmove 内存拷贝
void *my_memmove(void *dst, void *src, size_t num)
{
assert(dst);
assert(src);
char *dst1 = (char*)dst;
char *src1 = (char*)src;
//dst一定要比src大
//dst>src 说明dst在src的后面 dst<src+num 说明dst在src和src+num之间,也就是这个长度之间,num是src的长度
if ((dst1 >= src1) || (dst1<=src1+num))
{
//从右向左
dst1 = dst1 + num - 1;
src1 = src1 + num - 1;
while (num--)
{
*dst1 = *src1;
dst1--, src1--;
}
}
else
{
//从左向右拷
while (num--)
{
*dst1 = *src1;
dst1++, src1++;
}
}
return dst1;
}
int main()
{
char dst[] = "abcdef";
char src[] = "cdefgh";
my_memmove(dst+1, src, strlen(dst) + 1);
printf("%s\n", dst);
system("pause");
return 0;
}
- 与memcpy的区别就是memmove函数处理的源内存块的目标内存块是可以重叠的