C语言之memcpy()函数
昨天被问了个很基础的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()函数相关推荐
- C语言之memcpy函数
昨天自己动手实现memcpy这个函数,用一个例程试了一下,结果正确,满心欢心,可是有些地方想不明白,于是百度了一下,结果自己写的函数简直无法直视. 觉得还是写个总结,以示教训. 先贴上我自己的函数: ...
- c语言memcpy是什么,C语言memcpy函数的用法
介绍 memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, const void *sr ...
- 内存函数-----Memcpy函数
memcpy函数 头文件:<string.h> 函数功能:将从源地址source开始的num个字节复制到目标地址destination处 函数参数及返回值类型:void* memcpy(v ...
- C语言 memcpy函数(增加dst 从第一字节拷贝判断)的内部简单实现方式
刚学习C语言编程的时候,感觉C内部函数深不可测,通过代码很难实现.后来经常慢慢的学习过程,理解了部分C函数的实现方法,下面简单说下memcpy函数的内部实现方式之一. 简单概括内存拷贝的含义:字节对齐 ...
- memcpy函数实现(c语言)
memcpy函数实现(c语言) second60 20180530 #include <stdio.h> #include <assert.h> void *memcpy_n ...
- C语言:memcpy、memmove等函数的了解,使用以及模拟实现
C语言:memcpy.memmove等函数的了解,使用以及实现 1.memcpy函数的介绍,使用,以及实现 2.memmove函数的介绍,使用,以及实现 1.memcpy函数的介绍,使用,以及实现 1 ...
- C语言 memcpy 函数 - C语言零基础入门教程
目录 一.memcpy 函数简介 二.memcpy 函数实战 1.memcpy 函数简单使用 2.strcpy 函数属于字符串拷贝 3.memcpy 函数属于内存拷贝 4.memcpy 函数注意崩溃问 ...
- C语言中关于memcpy函数
关于memcpy函数 **memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void destin, void source, unsigned n):函数的功能是从 ...
- c语言memcpy函数源代码,memcpy函数-memcpy函数,C语言
本教程分享:<memcpy函数>, memcpy是memorycopy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下:. void * memcpy ; .如 ...
最新文章
- C#泛型对类型参数的推断
- linux永久改变字符集,Linux 下mysql永久更改字符集
- 每天一道LeetCode-----以字符串的形式输出二叉树所有从根节点到叶子节点的路径
- python使用蓝牙功能_python bluetooth蓝牙信息获取蓝牙设备类型的方法
- PyTorch 1.0 中文文档:torchvision 参考
- STM32学习:串口通讯(proteus仿真)
- 2005 mysql连接字符串_怎么用c#远程连接sql server2005,连接字符串怎么写
- 《流畅的Python》读书笔记——符合Python风格的对象
- deepin linux 怎么安装软件,deepinLinux系统安装及软件安装
- html入门圣思园视频,Java Web学习历程-(基于圣思园视频教程)
- 您的php似乎没有安装运行wordpress所必需的mysql扩展_“您的 PHP 似乎没有安装运行 WordPress 所必需的 MySQL 扩展”处理方法...
- 做你的大玩具——轩小样儿的六一
- php约束性别默认为男,在表单中包含性别选项,且默认状态为“男”被选中,下列正确的是( )...
- Windows Route 路由表命令详解
- 解决问题(七)——jsf+spring+hibernate整合(一)
- 字库芯片介绍与使用(附STM32程序~~~)
- Java框架tk_TKmybatis的框架介绍和原理解析
- PHP数据库操作类ADODB 详解
- Android13 App 预装详解
- 订单波次出库详解:流程、系统与设备