memcpy函数
来源:互联网 发布:oracle修改数据库密码 编辑:程序博客网 时间:2024/05/16 14:33
面试中如问到memcpy的实现,那就要小心了,这里有陷阱。
先看下标准memcpy()的解释:
1
void
*
memcpy
(
void
*dst,
const
void
*src,
size_t
n);
2
//If copying takes place between objects that overlap, the behavior is undefined.
事实上所说的陷阱也在于此,自己动手实现memcpy()时就需要考虑地址重叠的情况。
另外,标准库也提供了地址重叠时的内存拷贝函数:memmove(),那么为什么还要考虑重写memcpy()函数呢?
因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。
下面给出memcpy()的实现,为了与标准库函数区分,我们实现其包裹函数:
01
#include <stdio.h>
02
#include <stdlib.h>
03
#include <string.h>
04
05
void
*Memcpy(
void
*dst,
const
void
*src,
size_t
size);
06
07
int
main(
int
argc,
char
*argv[])
08
{
09
char
buf[100] =
"abcdefghijk"
;
10
//memcpy(buf+2, buf, 5);
11
Memcpy(buf+2, buf, 5);
12
printf
(
"%s\n"
, buf+2);
13
}
14
15
void
*Memcpy(
void
*dst,
const
void
*src,
size_t
size)
16
{
17
char
*psrc;
18
char
*pdst;
19
20
if
(NULL == dst || NULL == src)
21
{
22
return
NULL;
23
}
24
25
if
((src < dst) && (
char
*)src + size > (
char
*)dst)
// 自后向前拷贝
26
{
27
psrc = (
char
*)src + size - 1;
28
pdst = (
char
*)dst + size - 1;
29
while
(size--)
30
{
31
*pdst-- = *psrc--;
32
}
33
}
34
else
35
{
36
psrc = (
char
*)src;
37
pdst = (
char
*)dst;
38
while
(size--)
39
{
40
*pdst++ = *psrc++;
41
}
42
}
43
44
return
dst;
45
}
使用Memcpy()的结果:
1
abcdehijk
1
abadehijk
- memcpy函数
- memcpy函数
- memcpy () 函数
- memcpy函数
- memcpy函数
- memcpy函数
- memcpy()函数
- memcpy 函数
- memcpy函数
- memcpy函数
- memcpy()函数
- memcpy函数
- memcpy函数
- memcpy函数
- memcpy 函数
- 函数 memcpy
- memcpy函数
- memcpy 函数
- 解析tar.gz和src.rpm的安装即源码包的编译和安装
- 数据结构-循环链表
- iphone开发中数据持久化之——嵌入式SQLite(三)
- 申请android google map API key
- Android 模拟器 段错误
- memcpy函数
- UVa 10970 Big Chocolate (模拟)
- Struts2 学习笔记——数据类型转换
- Android---两个视图间的淡入淡出
- [译]Android冰淇淋三明治ICS(4.0+)JNI局部引用的变化
- TCP的连接&断连&状态转移过程
- Hibernate主键生成策略
- dB与信噪比(SNR)
- 工程第一阶段(一)