目录
1.memcpy
*简单使用
翻译:
*模拟实现
注意事项:
*例题
1.memcpy
*简单使用
memcpy:memory copy
cplusplus的介绍 点我跳转
翻译:
函数
memcpy
void * memcpy ( void * destination, const void * source, size_t num );
复制内存块
直接从source指向的位置复制num个字节到destination指向的内存块(memory block)
由destination和source指针指向对象的潜在类型与这个函数无关(因为destination和source的类型为void*,没有限制);结果是以二进制复制的数据
这个函数不检查由sorce指向的字符串中的\0(即"免疫"\0) - 总是精确复制num个字节
为了避免溢出,由destination和source指针指向的数组应该至少为num个字节,而且两者不能重叠(对于重叠的内存块,memmove是一种更安全的方法)
参数
目标(destination):指向内容需要复制的目标数组,类型转换至一个void*类型的指针
源(source):指向要被复制的源的数据,类型转换至一个const void*类型的指针
个数(num):要复制的字节个数,size_t是无符号整型
返回值
目标已返回
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4 };
int arr2[4] = { 0 };
memcpy(arr2, arr1, 2 * sizeof(int));//拷贝arr1的前两个元素
return 0;
}
注意:arr1一个元素占4个字节,应用sizeof(int)来控制复制的元素个数
*模拟实现
设计一个函数sim_memcpy,和memcpy一样有3个参数
destination简写为dest,source简写为src
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
void* sim_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;//设置返回值
assert(dest && src);//确保不是空指针
while (num--)
{
//要以字节为单位复制,就要强制类型转换为char*
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4 };
int arr2[4] = { 0 };
sim_memcpy(arr2, arr1, 2 * sizeof(int));//拷贝arr1的前两个元素
return 0;
}
下断点调试后
注意事项:
1.
指针移动时不能按上方的图来写,void*没有指定类型,无法进行运算
修改过后任然无法通过,显示error C2036: “void *”: 未知的大小
优先级:++ > 强制类型转换,dest++ 会先执行自增操作,然后再将 dest 的值转换为 char*。但是这种写法并不能达到预期的效果,因此显示错误
改为即可
2.void类型的函数和void*类型的函数有区别
void类型的函数不用返回值
void*类型的函数返回一个指向某种类型(任意类型,不需要强制类型转换)的指针
*例题
欲将arr[0]~arr[4]的内容复制到arr[2]~arr[6]中,以下代码是否能成功执行?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
void* sim_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;//设置返回值
assert(dest && src);//确保不是空指针
while (num--)
{
//要以字节为单位复制,就要强制类型转换为char*
*((char*)dest) = *((char*)src);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
sim_memcpy(arr+2, arr, 5* sizeof(int));
return 0;
}
答案速查:
分析:
由于指针有重叠,内容被覆盖,所以不行
但调用VS的memcpy没有出现这样的情况
说明VS制作的memcpy函数超过了C11的标准