memmove、memccpy和memcpy
这三个函数都是内存拷贝,目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。
void* memcpy(void* dest,const void* src, size_t n){
assert(dest!=NULL && src != NULL);
char* d=dest;
const char* s=src;
while(n--)
*d++ = *s++;
return dest;
}
memccpy(void* dest,const void* src, int c, size_t n)
{
assert(dest!=NULL && src != NULL);
while( n )
*) dest = *(char *)srcl;
= (char *)dest + 1;
*)src == (char)c)
= (char *)src + 1;
return (n ? dest : NULL);
}
&& src != NULL);
*d = (char *)dest;
char* s = (const char*)src;
> d)
= *s++;
if(s < d)
= d + n - 1;
= s + n - 1;
= *s--;
dest;
}
当dest <= src-count 或dest >= src+count时,以上三个函数均不会产生覆盖问题,即源数据不会被更改。
若不在以上范围内,则源数据会被更改。 如:
char a[]={'a','b'};
char b[]={'c','d','e','f','g','h'};
或是直接char *p=b+2;memmove(p,b,sizeof(b));
发现即使a数组指向的空间不够存储数据,也能够移动成功。
如果在使用这些函数时,分配给足够的空间,然后再使用就不会出现覆盖问题。也就是
说如果外部分配给的空间不足以存储要拷贝的数据时,就有可能出现源数据被覆盖更改
的问题。
#include<stdlib.h>
#include<string.h>
int main()
{
int i=0;
char a[9]={'a','b','c','d','e','f','g','h','\0'};
char p[2]={'q','w'};//或char *p=a+2;
memmove(p,a,sizeof(a));
puts(a);
printf("_____________________________________________\n");
puts(p);
printf("_____________________________________________\n");
for(i =0;i<10;i++)
printf("%c %d \n",*(a+i),a+i);
printf("_____________________________________________\n");
for(i =0;i<8;i++)
printf("%c %d \n",*(p+i),p+i);
return 0;
}
把memmove(p,a,sizeof(a));改为memcpy(p,a,sizeof(a));或memccpy(p,a,'e',sizeof(a));再观察输出结果。
可以看出在目的存储空间不足时,便会出现源数据被覆盖改变的问题。 如果目的存储空间分配足够的空间,则便不会出现覆盖问题。
最新文章
- vertical-align 垂直居中
- jetbrick,新一代 Java 模板引擎,具有高性能和高扩展性
- ontouchstart
- 20个Linux服务器安全强化建议(二)
- 简化对象extend拓展
- Javascript之spry菜单栏
- Generate GUID using vbscript
- 查询linux发行版本号方法总结
- 交叉编译Python-2.7.13到ARM(aarch32)平台
- CTF---密码学入门第六题 古典密码
- 推荐一个利用 python 生成 pptx 分析报告的工具包:reportgen
- app常见专项测试点
- HTML5 ----- deviceorientation API
- spring 中单例 bean 初始化之后和销毁之前执行指定动作 postconstruct 和 preDestroy
- javax.servlet-api 和 servlet-api 区别
- Java学习笔记之——if条件语句和三目运算符
- Vscode下Python的用户界面介绍
- Nmap扫描教程之基础扫描详解
- 《C++标准程序库》笔记之三
- MSSQL存储过程实现拼接sql的注意点
热门文章
- js页面载入特效如何实现
- (十一)RabbitMQ消息队列-如何实现高可用
- [CSS] Conditionally Apply Styles Using Feature Queries @supports
- XHTML 结构化:使用 XHTML 重构网站 分类: C1_HTML/JS/JQUERY 2014-07-31 15:58 249人阅读 评论(0) 收藏
- [tmux] Handle history in tmux sessions
- java获取访问路径、域名、项目名、请求入参
- centos7 rabbitmq安装/配置
- 垃圾回收GC:.Net自己主动内存管理 上(三)终结器
- DirectX11学习笔记
- TensorFlow 学习(八)—— 梯度计算(gradient computation)