0
点赞
收藏
分享

微信扫一扫

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

捡历史的小木板 2024-09-21 阅读 17

目录

1.memcpy

*简单使用

翻译:

*模拟实现

注意事项:

*例题


1.memcpy

*简单使用

memcpy:memory copy

cplusplus的介绍 点我跳转

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

举报

相关推荐

0 条评论