内存操作函数
来源:互联网 发布:2016淘宝不能邮箱注册 编辑:程序博客网 时间:2024/05/29 04:34
为什么引入内存操作函数:在定义中字符串以NUL(空字节)结尾,所以字符串操作函数遇见‘\0’停止。因此我们引入内存操作函数,来解决“非字符串类型”中遇到NUL(数字0)的情况。
内存操作函数:内存操作函数与字符串操作函数非常类似,只不过内存操作函数能够处理任何类型的字节序列。在内存操作函数的参数中,有一个显示的参数说明了要处理的字节数,所以他遇见NUL不会停下来。
下面介绍两种常用的内存操作函数原型:
void *memcpy(void *dst,void const *src,sizt_t len);
memcpy从src的起始位置复制len个“字节”到dst中,可以复制任何类型的值,但是如果dst和src发生重叠,其结果是未定义的。
memcpy功能的实现:
#include<stdio.h>#include<stdlib.h>#include<assert.h>void * my_memcpy(void *dst, void const * src, int len){ char *p1=dst ; char *p2 = src ; while (len --) { *p1++= *p2++; } return dst ;}int main(){ int arr1[100] = { 0 }; int arr2[100]={23,1,2,3,4,5,6,7,8,9,10,11,12}; int len = 0; scanf( "%d", &len); int *ret =my_memcpy(arr1, arr2, len*sizeof (arr2[0])); printf( "%#p\n",&*ret); system( "pause"); return 0;}
void *memmove(void *dst,void const *src,size_t len);
memmove的行为与memcpy差不多,不过memmove考虑了src与dst重叠的情况。
memmove功能的实现:
#include<stdio.h>#include<stdlib.h>#include<assert.h>void * my_memmove(void *dst, void const * src, int len){ assert( dst != NULL); assert( src != NULL); char *p1 = dst ; char *p2 = src ; if ((p1 >= p2) && (p2 > p1 + len)) { for (int i = len - 1; i >= 0; i--) p1[i] = p2[i]; } else for (int i = 0; i < len; i++) { p1[i] = p2[i]; } return dst ;}int main(){ int arr1[100] = { 0 }; int arr2[100] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 23 }; int len = 0; scanf( "%d", &len); int *ret = my_memmove(arr1, arr2, sizeof (arr2[0])*len); printf( "%#p\n",&*ret); system( "pause"); return 0;}
1 0
- 内存操作函数
- 内存操作函数:
- 内存操作函数
- 内存操作函数
- 内存操作函数:_alloca
- 内存操作函数: calloc
- 内存操作函数: malloc
- 内存操作函数:realloc
- 内存操作函数:free
- 内存操作函数
- c内存操作函数
- C内存操作函数
- 内存操作函数
- 内存操作函数
- 内存操作函数
- c语言内存操作函数
- 操作内存的一些函数
- C语言内存操作函数
- js 前加感叹号是什么意思?比如 !function(){}(); 答案在这里
- 《深入浅出WPF》学习笔记之三
- 递归入门 杭电 2042
- 关于“幽灵架构”的补充说明5:改造控制器
- linux 源码包安装LNMP(linux+nginx+mysql+php)服务器环境
- 内存操作函数
- 通过服务来下载APK,并在通知栏显示下载进度(两种方式)
- jQuery 插件
- 可变参数列表
- 求逆序对
- 剑指offer—数组中只出现一次的数字
- Android 5.0隐藏标题栏
- HuaXinIM聊项目阶段总结二(从别人身上总结经验吸取教训)
- 浮点数的存储形式