本文主要介绍一些C语言中常用内存函数及部分函数的模拟实现。
以下函数均需要包含头文件:<string.h>
目录
一、memcpy函数
1.函数介绍
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。并返回destination的地址。
注意点:
① 这个函数在遇到 '\0' 的时候并不会停下来。
② 如果source和destination有任何的重叠,复制的结果都是未定义的。(重叠部分会被覆盖)
代码演示:
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[4] = { 0 };
memcpy(arr2, arr1, 12);
for (int i = 0; i < 4; i++)// 打印数组arr2
{
printf("%d ", arr2[i]);
}
return 0;
}
输出结果:1 2 3 0 拷贝了12字节,即3个整形。
2.memcpy的模拟实现
思路:
将void类型的指针强制转换成char类型的指针,即可每次只拷贝1个字节,再根据需要拷贝的字节数依次赋值即可。
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest && src);//确保两指针不为空指针
void* p = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return p;
}
二、memmove函数
1.函数介绍
函数memmove从destination的位置开始向后复制num个字节的数据到destination的内存位置,但是在重叠内存块这方面。
注意点:
① 如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。
② 如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
代码演示:
#include<stdio.h>
#include<string.h>
int main()
{
int arr[8] = { 1,2,3,4,5,6,7,8 };
memmove(arr + 2, arr, 12);
for (int i = 0; i < 8; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
输出结果:1 2 1 2 3 6 7 8
2.memmove的模拟实现
以上文演示代码中的数据为例:(存在重合区域)
从arr处拷贝3个整型到arr+2处,当从前向后拷贝第一个整型时,可以发现源区域中最后一个整型已经作为目标区域的第一个整型被覆盖了,因此继续拷贝下去无法得到上述的输出结果。
对于上述源字符串在目标字符串前方的情况,即src<dest的情况,我们采取从后向前拷贝的方式。
当src>dest时,即源区域在目标区域的后方,从前向后拷贝不会覆盖源区域的数据,正常拷贝即可。
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest && src);//确保两指针不为空指针
void* p = dest;
if (src < dest)// 从后向前拷贝
{
while (count--)
{
*((char*)dest+count) = *((char*)src+count);
}
}
else
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return p;
}
三、memcmp函数
1.函数介绍
比较从ptr1和ptr2指针开始的num个字节
注意点:
① 不同于strcmp函数,当在遇到 '\0' 的时候并不会停下来。
返回值:
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str1 大于 str2。
- 如果返回值 = 0,则表示 str1 等于 str2。
代码演示:
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4 };
int arr2[] = { 1,2,3,5 };
printf("%d\n", memcmp(arr1, arr2, 16));
return 0;
}
输出结果:-1
四、memset函数
1.函数介绍
复制字符value(一个无符号字符)到参数ptr1所指向的区域的前num个字符。
代码演示:
#include<stdio.h>
#include<string.h>
int main()
{
int arr[2] = { 0 };
memset(arr, 1, 4);
return 0;
}
结果: