内存拷贝函数的一般用法
有两种拷贝函数,strcpy()和memcpy(),strcpy()只能对字符串进行拷贝复制,十分不通用,但是memcpy()可以对任意两个相同类型的数据进行拷贝复制,极大地方便了编程过程中的一些特殊需要。
函数语法:memcpy(void* to,void* from,int number);
意为从from复制大小为number的内容到to所在位置
- 代码示例包含单个整型数据的copy和整型数组的copy,其他数据类型的copy都大致相同,就不一一给出示例了。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
void main()
{
int arr0,arr1=333;
memcpy(&arr0,&arr1,sizeof(int));
printf("%d\n",arr0);
int *arr2,arr3[3]={1,2,3};
arr2 = (int *)malloc(sizeof(int));
memcpy(arr2,arr3,3*sizeof(int));
printf("%d \n",arr2[2]);
}
需要注意,在使用memcpy()函数时同strcpy()函数一样,都需包含string.h头文件
memcpy()函数的拷贝原理分析
以深浅拷贝为例分析memcpy的拷贝原理
- memcpy()函数是从from位置复制一份数据到to所在位置,相当于我们常用的复制粘贴效果(类似于深拷贝),还有一种通过地址指向拷贝(也就是浅拷贝),下面我们通过代码和解析加以具体的分析。
用memcpy()函数与不用memcpy()函数进行拷贝数据的区分
- 用拷贝函数memcpy()实现数据拷贝(深拷贝) 代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
void main()
{
char str1[10][10];
printf("%d\n",sizeof(char)); //char 类型占1个字节
printf("%d\n",sizeof(char *)); //char *占4个字节,char *表示的是地址,因此长度为4
printf("%d\n",sizeof(str1));
//与下一个程序对比,在这里str不是以指针的形式出现,而是具体的字符串数组
char str[3][10],ptr[3][10]={"mayongen1","mayongen2","mayongen3"};
memcpy(str,ptr,8*sizeof(sizeof(char *))); //从ptr中,拷贝8*sizeof(char *)(即8*4=32字节)大小的空间容量信息,到str内
//用内存拷贝函数将字符串数组ptr的内容复制过去的 这里是 用拷贝函数和不用拷贝函数时两者的区别
for(int i=0;i<3;i++)
printf("%s\n",*(str+i));
printf("\n");
}
- 不用拷贝函数实现数据拷贝(浅拷贝) 代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
void main()
{
//str在这里是以二重字符串指针形式出现的
char **str,ptr[3][10]={"mayongen1","mayongen2","mayongen3"};
str=(char **)malloc(3*sizeof(char *));//申请了三个地址
//在这里申请的空间给三个字符串的首地址了
*str=ptr[0];
*(str+1)=ptr[1];
*(str+2)=ptr[2];
//用地址传递的方式将字符串数组ptr的内容复制过去的
for(int i=0;i<3;i++)
printf("%s\n",*(str+i));
printf("\n");
}