- 已经学习了字符串函数,那么接下来就要学习内存函数。
- memcpy的实现和模拟,通俗的来讲,memcpy本质上和strcpy差不多,都有拷贝的意思,它们所对应的头文件都是<string.h>,memcpy的返回类型是:void*,它的表达式为:void * memcpy ( void * destination, const void * source, size_t num );废话不多说,我们直接上代码:
memcpy的实现:则代码为:
#include<stdio.h>
#include<string.h>
int main()
//memcpy的实现
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
//memcpy--针对内存块进行拷贝
memcpy(arr2, arr1,20);
int i = 1;
for (i = 1; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
- memcpy模拟实现,则代码为:
//memcpy模拟实现 #include<assert.h> void* me_memcpy(void* des, const void* sou, size_t num) { void* ret = des; int i = 0; assert(des && sou);//防止des与sou是NULL while (num--) { *(char*)des = *(char*)sou; //使用char*类型的解引用,是为了访问1个字节。 (*(char*)sou)++; (*(char*)des)++; } return ret; } int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[20] = { 0 }; //memcpy--针对内存块进行拷贝 me_memcpy(arr2, arr1, 20); int i = 1; for (i = 1; i < 10; i++) { printf("%d ", arr2[i]); } return 0; }
大家想一想,这个问题:如果source和destination有任何的重叠,复制的结果都是未定义的,如果使用memcpy完成重叠拷贝则需要很繁琐的步骤,那么就需要memmove来实现重叠拷贝了。
-
我们看完了memcpy,接下来就要看看memmove了,
memmove的实现,则代码为:
//memmove的实现,它和memcpy的形式基本相同
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1+2, arr1, 5 * sizeof(int));
int i = 1;
for (i = 1; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
- memmove的模拟实现,则代码为:
//memmove的模拟实现 void* mr_memmove(void* des, const void* sou, size_t num) { void* ret = des; assert(des && sou); if (des < sou) //前->后 { while (num--) { *(char*)des = *(char*)sou; des = (char*)des + 1; sou = (char*)sou + 1; } } else { //后 -> 前 while (num--) { *((char*)des + num) = *((char*)sou + num); } } } int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; mr_memmove(arr1 + 2, arr1, 5 * sizeof(int)); int i = 1; for (i = 1; i < 10; i++) { printf("%d ", arr1[i]); } return 0; }
这就是:C语言内存函数其中之二的内存函数:memcpy和memmove。