说明:

1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。

2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

3.memcpy 的操作对象不局限于某一类数据类型,或者说可适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。

例:

example1

作用:将s中的字符串复制到字符数组d中。

//memcpy.c

#include

#include

intmain()

{

char*s="Golden Global View";

chard[20];

clrscr();

memcpy(d,s,strlen(s));

d[strlen(s)]='\0';//因为从d[0]开始复制,总长度为strlen(s),d[strlen(s)]置为结束符

printf("%s",d);

getchar();

return0;

}

输出结果:GoldenGlobal View

example2

作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始)

#include

intmain()

{

char*s="Golden Global View";

chard[20];

memcpy(d,s+14,4);//从第14个字符(V)开始复制,连续复制4个字符(View)

//memcpy(d,s+14*sizeof(char),4*sizeof(char));也可

d[4]='\0';

printf("%s",d);

getchar();

return0;

}

输出结果: View

与sprintf strcpy函数的区别比较:

这些函数的区别在于 实现功能 以及 操作对象 不同。

strcpy 函数操作的对象是 字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。

sprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现(字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。

memcpy 函数顾名思义就是 内存拷贝,实现 将一个 内存块 的内容复制到另一个 内存块这一功能。内存块由其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy 的操作对象不局限于某一类数据类型,或者说可 适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于 memcpy 函数等长拷贝的特点以及数据类型代表的物理意义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。

linux下memcpy函数源码实现:

void *memcpy(void *to, const void *from, size_t n)

{

void *xto = to;

size_t temp, temp1;

if (!n)

return xto;

if ((long)to & 1) {

char *cto = to;

const char *cfrom = from;

*cto++ = *cfrom++;

to = cto;

from = cfrom;

n--;

}

if (n > 2 && (long)to & 2) {

short *sto = to;

const short *sfrom = from;

*sto++ = *sfrom++;

to = sto;

from = sfrom;

n -= 2;

}

temp = n >> 2;

if (temp) {

long *lto = to;

const long *lfrom = from;

#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)

for (; temp; temp--)

*lto++ = *lfrom++;

#else

asm volatile (

" movel %2,%3\n"

" andw #7,%3\n"

" lsrl #3,%2\n"

" negw %3\n"

" jmp %%pc@(1f,%3:w:2)\n"

"4: movel %0@+,%1@+\n"

" movel %0@+,%1@+\n"

" movel %0@+,%1@+\n"

" movel %0@+,%1@+\n"

" movel %0@+,%1@+\n"

" movel %0@+,%1@+\n"

" movel %0@+,%1@+\n"

" movel %0@+,%1@+\n"

"1: dbra %2,4b\n"

" clrw %2\n"

" subql #1,%2\n"

" jpl 4b"

: "=a" (lfrom), "=a" (lto), "=d" (temp), "=&d" (temp1)

: "0" (lfrom), "1" (lto), "2" (temp));

#endif

to = lto;

from = lfrom;

}

if (n & 2) {

short *sto = to;

const short *sfrom = from;

*sto++ = *sfrom++;

to = sto;

from = sfrom;

}

if (n & 1) {

char *cto = to;

const char *cfrom = from;

*cto = *cfrom;

}

return xto;

}

linux memcpy需要头文件,memcpy函数详解相关推荐

  1. linux printk 头文件,printk函数详解

    printk是内核态信息打印函数,功能和比准C库的printf类似. printk还有信息打印级别. 函数原型: int printk(const char *fmt, ...) 需要的头文件: #i ...

  2. linux的阻塞waitqueue,Linux阻塞控制 wait_event与wait_event_interruptible函数详解

    Linux阻塞控制 wait_event与wait_event_interruptible函数详解 最近研究了一下linux驱动对进程的阻塞与非阻塞的控制,感觉linux对进程的控制真的是牛逼,各种进 ...

  3. 在linux系统中创建文件夹,Linux系统中创建文件夹命令详解

    Linux系统中创建一个新的文件夹我们可以使用命令来执行,下面由学习啦小编为大家整理了Linux系统中创建文件夹命令详解,希望对大家有帮助! Linux系统中创建文件夹命令详解 一.mkdir命令使用 ...

  4. linux命令打包文件,Linux系统中打包文件的命令详解

    linux系统中遇到要打包文件的时候我们该使用什么命令呢?下面由秋天网 Qiutian.ZqNF.Com小编为大家整理了linux系统中打包文件的命令详解的相关知识,希望对大家有帮助! linux系统 ...

  5. linux文件目录:Linux中各目录(文件夹)作用详解(持续更新)

    进入Linux系统,我们就是畅游在各种目录文件中,毕竟Linux是"文件系统",文件的存放就是在目录下面,那我们了解下"Linux中各目录(文件夹)作用详解"还 ...

  6. 【Linux】U-Boot启动文件start.S详解(超详细讲解,上篇)

    U-Boot U-Boot的版本选择 U-Boot的下载地址:/pub/u-boot的索引 进入到U-Boot的下载页面,发现U-Boot的版本众多: 那怎么选取U-Boot的版本呢?够用就行. 本文 ...

  7. 一次性就能学会的文件操作!(文件操作函数详解)

    前言:在上一篇博客关于文件的基础知识中我们对文件有了一定的了解,本篇博客将会详细讲解操作文件的函数. 文章目录 文件的顺序读写 字符输入输出函数 -- fgetc 与 fputc fputc函数 fg ...

  8. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  9. Linux 内存映射函数 mmap()函数详解

    mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.mmap在用户空间映射调用系统中作用很大. 头文件 <sys ...

  10. C++头文件,预处理详解

    一个例子 C++遵循先定义,后使用的原则.就拿函数的使用来举例吧. 我看过有些人喜欢这样写函数. #include<iostream> using namespace std;int ad ...

最新文章

  1. hitTest和pointInside方法
  2. MySQL查询字段区不区分大小写? innodb的事务与日志的实现方式?binlog的几种日志录入格式以及区别?
  3. idea提交spark任务,内存不足,指定JVM内存的解决方法
  4. 服务器与客户端渲染(AngularJS与服务器端MVC)
  5. linux设置默认的首页文件,Linux 设置Firefox主页
  6. 【 HDU - 1525 】Euclid's Game(较难找规律,玄学博弈,分析必败点必胜点)
  7. WEB-移动端图片适配-弹框
  8. 佳能g2810提示5b00_佳能G2810打印机清零软件5B00 5b01废墨清零1700代码
  9. OpenModelica中的可视化仿真
  10. PS教程:快速蒙版抠图
  11. 向日葵公主与驴的爱情故事
  12. 微信小程序检测版本是否有更新
  13. [C++] printf pitfall
  14. 小工具推荐:tokei(高效统计代码行数)
  15. 如何恢复计算机我的电脑工具栏,我的电脑工具栏不见了,怎样恢復
  16. 舒亦梵:几条投资理念,决定你是否具有富人思维
  17. python青蛙跳台阶_Python之青蛙跳台阶
  18. 人脸对齐算法常用评价标准总结
  19. 如何设置无线路由器,实现WIFI上网?
  20. VS2008运行过程中出现regsvr32问题解决方法记录

热门文章

  1. python 基础 字符串烧烤流程
  2. 《百家讲坛》大汉风云人物
  3. 小猪的Git使用总结
  4. 修改手机屏幕刷新率_简谈手机屏幕的「高刷新率」
  5. Excel如何快速实现四舍五入
  6. 实现数据的备份和恢复 Oracle实训
  7. 通过小程序获取公众号openid
  8. 1) 以实现用户在桌面上存储的资料不会因为用户改变计算机而消失.,2014年计算机软考程序员考前模拟试题及答案...
  9. 解决ADT中新建Android工程出现多个appcompat_v7的问题
  10. chatgpt赋能Python-python_kurt