大家好!我是铦。
内存操作函数头文件为<memory.h> or <string.h>
1、memcpy
原型为:void *memcpy( void *dest, const void *src, size_t count )
作用为:把src指向内容拷贝到src指向的内容中
使用格式:memcpy(目的地地址,源头地址,操作内存大小(字节))
我们试着模拟一下
#include"stdio.h"
#include"assert.h"
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[5] = { 0 };
my_memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
我们发现arr1中的前4*5个字节被拷贝到arr2中。(一个整型4字节)
*注意:
1、memcpy遇到'\0'不会停下
因为memcpy根据根据操作内存大小来拷贝。
2、memcpy不能拷贝重叠内存
如果代码如下,则结果却不是我们想要的。这是因为memcpy在拷贝过程中将arr1[0]拷贝到arr1[2]处后再想把arr1[2]中的3拷贝到arr1[4]中时发现arr1[2]已经被改为1了。
2、memmove
原型为:void *memmove( void *dest, const void *src, size_t count )
作用为:内存拷贝(可拷贝重叠内存)
使用格式:memmove(目的地地址,源头地址,操作内存大小(字节))
个人认为是memcpy的升级版哈哈
我们试着模拟一下
#include"stdio.h"
#include"assert.h"
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
//从前往后拷贝
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//从后往前拷贝
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return ret;
}
int main()
{
int arr1[10] = { 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;
}
结果如上图,我们发现 memcpy实现不了的拷贝重叠内存,memmove可以实现。
3、memcmp
原型为:int memcmp( const void *buf1, const void *buf2, size_t count );
作用为:内存比较
使用格式:memcpy(地址1,地址2,比较的内存大小 (字节))
我们试着使用用一下
#include"stdio.h"
#include"string.h"
int main()
{
char buffer1[] = "abcde";
char buffer2[] = "abce";
int ret = memcmp(buffer1, buffer2, 4);
printf("%d", ret);
return 0;
}
返回值:
当两个参数进行逐字节比较时,如果遇到的第一对不同内存时,若参数1中的数据大于参数2中的数据,则返回大于0的数,反之返回小于0的数,若在比较字节内全部相同返回0。
4、memset
原型为:void *memset( void *dest, int c, size_t count )
作用为:内存设置
使用格式:memset(目的地地址,想改成的数字,设置多少字节)
我们试着使用用一下就能知道作用了
谢谢大家观看,写得不好还请指出!