自学内容网 自学内容网

58.【C语言】内存函数(memcpy函数)

目录

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的标准


原文地址:https://blog.csdn.net/2401_85828611/article/details/142337222

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!