当前位置:首页 » 编程语言 » c语言简单实现memcpy
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言简单实现memcpy

发布时间: 2023-02-11 20:57:40

c语言实现字符串拷贝函数的几种方法

首先是使用库函数
比如下面代码

void ourStrCopy(char S1[] , char S2[]){ strcpy(S1, S2); //该函数还有另一个版本可以按长度截取 }

还有一个函数是memcpy,这个是内存拷贝,原型是

void memcpy(void *dest, const void *src, size_t n); 需要注意的是这个函数第一个和第二个指针都是void型且第二个指针不能被修改,第三个参数是需要拷贝的内存长度按字节记。

然后是用指针引用,注意这个并非赋值,而是引用,这种操作需要注意内存。

char s1[] = "abcdefg";//定义一组字符串char *s2 = s1;//按照指针拷贝字符串

第三种方法就是直接赋值了

void outStrCopy(char s1[] , char s2[]){ int len1 = strlen(s1);//获取第一个字符串的长度 int len2 = strlen(s2);//获取第二个字符串的长度 int len = 0; //字符串总长度 if(len1 <= len2){ len = len2; //选择COPY的长度 }else{ len = len1; } for(int i = 0 ; i < len ; i++){ s1[i] = s2[i]; //实现数据拷贝 }}

② c语言如何实现结构体的深度复制

使用memcpy即可, 比如你另外建立一个结构体sortbook[1000]用来保存排序结果,将book中的第i个元素赋值到sortbook的第j个元素中
memcpy(&sortbook[j], &book[i], sizeof(struct book));
用这个函数需要#include <string.h>

函数原型
void *memcpy(void*dest, const void *src, size_t n);
功能
由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
头文件
#include<string.h>
返回值
函数返回一个指向dest的指针。
说明
1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。
2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。

memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
例:
char a[100], b[50];
memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:
char a[100], b[50];
strcpy(a,b);
3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
//注意,source和destin都不一定是数组,任意的可读写的空间均可。

③ c语言如何实现多维整型数组的复制

memcpy(目的地址,源地址,字节数)
由于数组元素为连续内存存放
可以使用此函数,将源地址的内存内容,复制到目的地址去,字节数为sizeof(数组名)

④ C语言中怎么把一维数组赋给另外一个一维数组

不可以,之所以不可以是因为数组名是个常量,它的值是数组首元素地址,即不能将其它值付给这个常量。

可以采用循环的方法逐个复制,或者采用另一个同类型的指针(相对于数组名,指针是变量)指向要复制的数组,之后就可以采用这个指针访问之前的那个数组。

(4)c语言简单实现memcpy扩展阅读:

当数组中每个元素都只带有一个下标时,称这样的数组为一维数组。

一维数组是由数字组成的以单纯的排序结构排列的结构单一的数组。一维数组是计算机程序中最基本的数组。二维及多维数组可以看作是一维数组的多次叠加产生的。数组是计算机编程中的重要概念,运用数组可以方便地处理大规模的数据。

⑤ memcpy与memmove的区别

memcpy和memmove都是C语言的库函数,相比于strcpy和strncpy只能拷贝字符串数组,memcpy与memmove可以拷贝其它类型的数组,但是为什么要同时提供两种方法呢?本文主要就是介绍这两个函数的区别。

首先来看函数原型:

这两个函数都是将s2指向位置的n字节数据拷贝到s1指向的位置,区别就在于关键字restrict, memcpy假定两块内存区域没有数据重叠,而memmove没有这个前提条件。如果复制的两个区域存在重叠时使用memcpy,其结果是不可预知的,有可能成功也有可能失败的,所以如果使用了memcpy,程序员自身必须确保两块内存没有重叠部分。

我们来看一组示例:

正常情况下,即使内容有重叠,src的内容也可以正确地被拷贝到了dest指向的空间。

这种情况下,src的地址小于dest的地址,拷贝前3个字节没问题,但是拷贝第4,5个字节时,原有的内容已经被src拷贝过来的字符覆盖了,所以已经丢失原来src的内容,这很明显就是问题所在。

一般来说,memcpy的实现非常简单,只需要顺序的循环,把字节一个一个从src拷贝到dest就行:

memmove会对拷贝的数据作检查,确保内存没有覆盖,如果发现会覆盖数据,简单的实现是调转开始拷贝的位置,从尾部开始拷贝:

这里 __np_anyptrlt 是一个简单的宏,用于结合拷贝的长度检测dest与src的位置,如果dest和src指向同样的对象,且src比dest地址小,就需要从尾部开始拷贝。否则就和memcpy处理相同。
但是实际在C99实现中,是将内容拷贝到临时空间,再拷贝到目标地址中:

由此可见memcpy的速度比memmove快一点,如果使用者可以确定内存不会重叠,则可以选用memcpy,否则memmove更安全一些。另外一个提示是第三个参数是拷贝的长度,如果你是拷贝10个double类型的数值,要写成sizeof(double)*10,而不仅仅是10。