memcpy——内存块复制
从源头指向的内存块拷贝固定字节数的数据到目标指向的内存块。
该函数不会检查任何终止字符(如'\0'),而总是精确的拷贝参数传入的字节数。
void * memcpy (要拷贝到的目的地内存块, 拷贝数据的来源内存块, 要拷贝的字节大小)
void * memcpy ( void * destination, const void * source, size_t num )
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1 + 2, 20);
return 0;
}
模拟实现my_memcpy函数
#include<assert.h>
void* my_memcpy(void* dest, const void* src,size_t num)
{
int* ret = dest;
assert(dest && src);
while (num--)
{
*(int*)dest = *(int*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1 + 2, 20);
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
输出:
3 4 5 6 7 8 0 0 0 0
memmove——重叠内存的拷贝
memmove( )比 memcpy( )更安全,在目标区域和源区域有重叠的情况下,memmove( )的拷贝确保源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改,但目标区域与源区域没有重叠情况时与memcy( )函数相同。
void *memmove(要拷贝到的目的地内存块, 拷贝数据的来源内存块, 要拷贝的字节大小)
void *memmove(void *dest, const void *src, size_t num)
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1, arr1 + 2, 20);
return 0;
}
模拟实现my_memmove函数
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
int* ret = dest;
assert(dest && src);
//前->后
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;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1, arr1 + 2, 20);
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
输出:
3 4 5 6 7 6 7 8 9 10
memset——内存设置函数
将一块内存区域的每个字节设置为指定的值。
注意:以字节为单位设置内存中的数据
void *memset(内存区域的起始地址,要替换的内容,要替换的字节数)
void *memset(void *ptr, int value, size_t num)
int main()
{
char arr[] = "hello world";
memset(arr, 'x', 5);
printf("%s\n", arr);
memset(arr+6, 'y', 5);
printf("%s\n", arr);
return 0;
}
输出:
xxxxx world
xxxxx yyyyy