//内存操作函数
1.memcpy
2.memmove
3.memcmp
4.memset
之前介绍了字符串操作函数,现在我们来介绍一下内存操作函数
memcpy函数拷贝内存信息到目标空间,是按bit为单位来拷贝
#include
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr1[5] = { 0 };
memcpy(arr1, arr, 20);//拷贝1,2,3,4,5到arr1里,需要拷贝20个字节
int sz = sizeof(arr1) / sizeof(arr1[0]);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
模拟实现memcpy
//模拟实现memcpy
#include
void* my_memcpy(void* dest,void* src, size_t num)
{
assert(dest && src);//断言
void* ret = dest;
while (num--)//
{
*(char*)dest = *(char*)src;//强制类型转换为char* ,然后一个字节一个来换
dest = (char*)dest + 1;//换完一个字节向后+1,进行下一个字节的交换
src = (char*)src + 1;
}
return ret;//交换完成后返回地址
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[5] = { 0 };
my_memcpy(arr2, arr1, 20);
int sz = sizeof(arr2) / sizeof(arr2[0]);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
问题:假如我想在一个数组里将几个元
素拷贝到后面几个元素,如何?
程序挂了。。。。。。所以综上所述,my_memcpy不能实现重叠
那想自己拷贝自己就得使用另外一个函数--------memmove
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//运用模拟实现的memcpy将数组里的12345拷贝到34567上,如何?
//my_memcpy(arr1 + 2, arr1, 20);
memmove(arr1 + 2, arr1, 20);
int sz = sizeof(arr1) / sizeof(arr1[0]);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
memmove代码使用如图
模拟实现memmove
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--)
{
}
}
//---------------------------------------------------------------------------
//memcmp
//int main()
//{
// int arr1[] = { 1,2,3,4,5 };
// int arr2[] = { 1,2,3,4,0x11223305 };
// int ret = memcmp(arr1, arr2,17);//一对字节一对字节进行比较
// printf("%d\n", ret);
// return 0;
//}
//------------------------------------------------------
//memset 内存设置
//#include
//int main()
//{
// int arr[] = { 2,3,4,5 };
// memset(arr, 6, 10);//20代表设置多少个字节,memset是一个字节一个字节改的
//
// return 0;
//}