昨天被问了个很基础的C语言的问题。
写出u8 * memcpy(u8 * src, u8 * dst, size_t len)的定义。

比较紧张,以为要考虑很多东西;于是,将很多乱七八糟的情况考虑了下。
一般写成void *,强制转换成8bit的类型。事实上,由于这里使用unsigned char型,不再需要强制转换了。

src和dst是否为空,我用if判断。如果src空,则出错;dst空,当时想到怎样解决这个问题。
如果在这里为dst申请空间,那么由谁来释放?
由于容易造成内存泄漏,被调用函数申请空间不可取,因此还是直接报错。申请空间的责任应该由调用者负担,同时由他回收,确保内存安全。

可以设置assert:
assert(dst != NULL || src != NULL);

如果用
*src ++ = *dst ++;
需要另外定义一个指针,指向dst的首字节,供返回指针使用。
也可以另外定义临时变量,使用for循环
*(src  + i) = *(dst  + i);
这样,dst没变,直接返回。

如果src和dst在len长度下有覆盖怎么办?
*                src |         |
*                           dst|        | 
事实上,在库函数中,memcpy不能改变源数据,此时应该报错。
在memmove中,才可以覆盖掉src。
但我还是根据他的指示,将重复区覆盖了。
事实上,如果使用for循环的形式,可以直接从最后向前进行拷贝,不须覆盖,结果总正确。由于拷贝是从最高位开始,这样就保证src中还没拷贝的块不会因为dst的原因被修改。

如果调用库函数memcpy()和memmove(),则要注意:

函数memcpy()从src指向的区域向dst指向的区域复制len个字符;如果两数组重叠,不定义该函数的行为。  
  而memmove(),如果两函数重叠,赋值仍正确进行。

memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用emcpy;  
  如果你不能保证是否有重叠,并且源数组不再使用,为了确保复制的正确性,你必须用memmove。

C语言之memcpy()函数相关推荐

  1. C语言之memcpy函数

    昨天自己动手实现memcpy这个函数,用一个例程试了一下,结果正确,满心欢心,可是有些地方想不明白,于是百度了一下,结果自己写的函数简直无法直视. 觉得还是写个总结,以示教训. 先贴上我自己的函数: ...

  2. c语言memcpy是什么,C语言memcpy函数的用法

    介绍 memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, const void *sr ...

  3. 内存函数-----Memcpy函数

    memcpy函数 头文件:<string.h> 函数功能:将从源地址source开始的num个字节复制到目标地址destination处 函数参数及返回值类型:void* memcpy(v ...

  4. C语言 memcpy函数(增加dst 从第一字节拷贝判断)的内部简单实现方式

    刚学习C语言编程的时候,感觉C内部函数深不可测,通过代码很难实现.后来经常慢慢的学习过程,理解了部分C函数的实现方法,下面简单说下memcpy函数的内部实现方式之一. 简单概括内存拷贝的含义:字节对齐 ...

  5. memcpy函数实现(c语言)

    memcpy函数实现(c语言) second60  20180530 #include <stdio.h> #include <assert.h> void *memcpy_n ...

  6. C语言:memcpy、memmove等函数的了解,使用以及模拟实现

    C语言:memcpy.memmove等函数的了解,使用以及实现 1.memcpy函数的介绍,使用,以及实现 2.memmove函数的介绍,使用,以及实现 1.memcpy函数的介绍,使用,以及实现 1 ...

  7. C语言 memcpy 函数 - C语言零基础入门教程

    目录 一.memcpy 函数简介 二.memcpy 函数实战 1.memcpy 函数简单使用 2.strcpy 函数属于字符串拷贝 3.memcpy 函数属于内存拷贝 4.memcpy 函数注意崩溃问 ...

  8. C语言中关于memcpy函数

    关于memcpy函数 **memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void destin, void source, unsigned n):函数的功能是从 ...

  9. c语言memcpy函数源代码,memcpy函数-memcpy函数,C语言

    本教程分享:<memcpy函数>, memcpy是memorycopy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下:. void * memcpy ; .如 ...

最新文章

  1. C#泛型对类型参数的推断
  2. linux永久改变字符集,Linux 下mysql永久更改字符集
  3. 每天一道LeetCode-----以字符串的形式输出二叉树所有从根节点到叶子节点的路径
  4. python使用蓝牙功能_python bluetooth蓝牙信息获取蓝牙设备类型的方法
  5. PyTorch 1.0 中文文档:torchvision 参考
  6. STM32学习:串口通讯(proteus仿真)
  7. 2005 mysql连接字符串_怎么用c#远程连接sql server2005,连接字符串怎么写
  8. 《流畅的Python》读书笔记——符合Python风格的对象
  9. deepin linux 怎么安装软件,deepinLinux系统安装及软件安装
  10. html入门圣思园视频,Java Web学习历程-(基于圣思园视频教程)
  11. 您的php似乎没有安装运行wordpress所必需的mysql扩展_“您的 PHP 似乎没有安装运行 WordPress 所必需的 MySQL 扩展”处理方法...
  12. 做你的大玩具——轩小样儿的六一
  13. php约束性别默认为男,在表单中包含性别选项,且默认状态为“男”被选中,下列正确的是( )...
  14. Windows Route 路由表命令详解
  15. 解决问题(七)——jsf+spring+hibernate整合(一)
  16. 字库芯片介绍与使用(附STM32程序~~~)
  17. Java框架tk_TKmybatis的框架介绍和原理解析
  18. PHP数据库操作类ADODB 详解
  19. Android13 App 预装详解
  20. 订单波次出库详解:流程、系统与设备

热门文章

  1. 如何开张美国银行卡CitiBank
  2. 高等数学(Space Analytic Geometry)
  3. 多因素分析模型解决方法_选择模型方法的8个决定因素
  4. 基于手机蓝牙的arduino遥控小车
  5. 刘强东怼天猫,是在陈述事实还是另有深意?
  6. 车载以太网解决方案 助力智能网联汽车开发
  7. 理解MySQL复制(Replication)
  8. RNN代码简单实现(周杰伦歌词示例)
  9. Unity---Shader
  10. return 不能跳出 forEach 循环