内存操作函数memcpy()和memmove()的用法

一.string.h库中的memcpy()和memmove()函数简介:

  不能把一个数组的值直接赋予另一个数组,因此,我们使用循环把数组中的元素逐个复制到另一个数组。一个例外情况是:可以使用strcpy()和strncpy()函数复制字符数组。memcpy()和memmove()函数为复制其他类型数组提供了类似的便利工具,下面是两个函数的原型:

void *memcpy(void * restrict s1,const void *s2,size_t n);
void *memmove(void * s1,const void *s2,size_t n);

  这两个函数均从s2指向的位置复制n个字节数据到s1指向的位置。且均返回s1的值。两者间的差别由关键字restrict造成,即memcpy()可以假定两个内存区域之间没有重叠。memmove()则不会做这个假定,因此,复制过程类似于首先将所有字节复制到一个临时缓冲区,然后再复制到最终目的地。如果两个区域存在重叠时使用memcpy()会怎样呢?结果是未知的。因此使用memcpy()时必须保证没有重叠区域。但memmove()可以有重叠部分。
  这两个函数可以对任何数据类型进行操作,因此两个指针参数为void类型的指针。C允许将任何类型的指针赋给void* 类型的指针。接受各种类型的指针导致无法知道要复制的数据类型。因此,这两个函数使用第三个参数来指定复制的字节数。注意,对数组而言,字节数不等于元素的个数。因此要复制10个double型数据,那么n=10*sizeof(double);
使用示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 10      				             //定义数组数据长度为10
void show_array(const int ar[], int n);          //声明数组显示函数
int main()
{
	int values[SIZE] = { 1,2,3,4,5,6,7,8,9,10 }; //定义int型原始数组
	float test_float[SIZE]= { 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0};  //定义float型原始数组
	double test_double[SIZE / 2] = { 1.0,2.0,3.0,4.0,5.0 };//定义double型原始数组
	int target[SIZE];                            //定义目标数组缓存区
	
	puts("values(original data): ");
	show_array(values, SIZE);                   //输出原始值

	puts("target(copy data): ");
	memcpy(target, values, 10 * sizeof(int));
	show_array(target, SIZE);                   //输出复制之后的值,输出int形式
 
	puts("using memmove() with overlapping ranges: ");
	memmove(values + 2, values, 5 * sizeof(int));
	show_array(values, SIZE);                   //输出使用memmove()移动之后存在覆盖的值

	puts("using memcpy() to copy float to int: ");
	memmove(target, test_float, SIZE * sizeof(int));
	show_array(target, SIZE);                 //输出复制之后的值,按int形式读取

	puts("using memcpy() to copy float to int,but output as float: ");
    printf("%f %f %f %f %f %f %f %f %f %f\n", *(float*)target, *(float*)(target + 1), *(float*)(target + 2), *(float*)(target + 3), *(float*)(target + 4), *(float*)(target + 5), *(float*)(target + 6), *(float*)(target + 7), *(float*)(target + 8), *(float*)(target + 9));//输出复制之后的值,按float形式读取

	puts("using memcpy() to copy double to int,but output as double:  ");
	memmove(target, test_double, (SIZE / 2) * sizeof(double));        
	printf("%lf %lf %lf %lf %lf\n", *(double*)target, *(double*)(target + 2), *(double*)(target + 4), *(double*)(target + 6), *(double*)(target + 8));//输出复制之后的值,按double形式读取

	system("pause");
	return 0;
}

void show_array(const int ar[], int n)
{
	int i;
	for (i = 0; i < n; i++)
		printf("%d ", ar[i]);
	putchar('\n');
}

输出结果:

values(original data):        
1 2 3 4 5 6 7 8 9 10          //输出的原始数据
target(copy data):
1 2 3 4 5 6 7 8 9 10          //输出的复制数据
using memmove() with overlapping ranges:
1 2 1 2 3 4 5 8 9 10          //输出的移位覆盖数据
using memcpy() to copy float to int:
1065353216 1073741824 1077936128 1082130432 1084227584 1086324736 1088421888 109
0519040 1091567616 1092616192   //float to int 并且按int读出的数据
using memcpy() to copy float to int,but output as float:
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000
 10.000000                     //float to int 并且按float读出的数据
using memcpy() to copy double to int,but output as double:
1.000000 2.000000 3.000000 4.000000 5.000000 //double to int 并且按double读出的数据

二.分析总结

  可以看出,最后一次memcpy()调用把数据从double数组复制到int数组。这表明memcpy()不知道也不关心数据类型;他们只是把一些字节从一个位置复制到另一个位置(例如,可以从结构中复制字节到字符型数组),复制过程中也不进行数据转换。如果使用循环对元素逐个赋值,那么在赋值过程中会将double类型值会转换为int类型值。对此,我们可以得出memcpy()和memmove()函数对字节按原样进行复制,然后根据程序的不同方式进行解释,如程序中可以按int型或者是float型进行解释,将得到不同显示结果。因此这两个函数只做字节转移,不做类型转换。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在C++中,memcpy()是一个用于内存拷贝的函数,它用于将一段内存的内容复制到另一段内存中。memcpy()函数的声明如下: ```cpp void* memcpy(void* destination, const void* source, size_t num); ``` 参数说明: 1. destination:指向目标内存的指针,表示拷贝的目的地。 2. source:指向源内存的指针,表示拷贝的来源。 3. num:要拷贝的字节数。 使用memcpy()函数时,需要注意以下几点: 1. 目标内存和源内存不能重叠。如果存在重叠,使用memmove()函数来代替。 2. num参数表示要拷贝的字节数,可以是任意整数。通常使用sizeof()运算符来获取需要拷贝的数据大小。 3. memcpy()函数返回一个指向目标内存的指针,即destination参数。 下面是一个使用memcpy()函数的示例: ```cpp #include <iostream> #include <cstring> int main() { const char* source = "Hello, World!"; char destination[20]; memcpy(destination, source, strlen(source) + 1); std::cout << "Copied string: " << destination << std::endl; return 0; } ``` 在这个示例中,我们使用memcpy()函数将字符串"Hello, World!"从源内存拷贝到目标内存中。源内存由source指针指向,目标内存由destination数组表示。我们通过获取源字符串的长度来确定要拷贝的字节数,并在目标内存的末尾添加了一个空字符,以确保字符串正确终止。 输出结果将显示拷贝后的字符串:"Hello, World!"。 总结起来,memcpy()函数是C++中用于内存拷贝的函数,它可以将一段内存的内容复制到另一段内存中。使用时需要注意参数的正确设置,以及目标内存和源内存不能重叠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tutu-hu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值