C/C++中的内存操作函数
2014-07-17 23:06
337 查看
背景:小白今天机缘巧合碰到了内存处理函数:memcpy,memmove,犹记得看到他两的那一刹那,你不认识我,我认识你的尴尬局面,现翻了翻网,总结了一下
常见的内存操作函数:
1. malloc / calloc
功能:动态内存分配函数
头文件:#include < stdlib.h >
函数原型:(void *)malloc ( size_t size ); // void *) 代表的是指向不确定类型的指针
(void * )calloc(int num, size_t size)//num为分配内存块的个数,size为分配内存块的大小
返回值:分配成功返回分配内存的首地址,失败返回NULL
区别:a. malloc一次只申请一个内存区,calloc一次可以申请多个内存区(calloc中有个内存块的参数num)
b. malloc不会对分配的内存初始化,calloc会初始化为0
注:malloc和calloc是C里面的用法,综合效果来说,不如C++中new,new不用考虑那么多,直接用即可。
2. free
功能:动态内存释放
头文件:#include < stdlib.h >
函数原型:void free ( ( void * ) ptr)//ptr为malloc或者calloc返回的分配内存的首地址,即内存指针
返回值:无
注:a. free是C中的释放内存的函数,C++中用的是delete,用法:一: delete ptr ;( 释放ptr指针相对应的内存 ) 二: delete [ ] ptr ;( ptr为指向数组的指针 )
b. malloc( calloc )和 free 是一一对应的,若有malloc或者calloc,但是没有free,容易造成内存泄露,同理,new 和 delete 也是一一对应的。
3. memcpy
头文件:#include < string.h >
函数原型:( void * )memcpy ( void * dest,const void * src,size_t n ) //dest为目标内存区,src为源内存区,n为需要拷贝的字节数
函数功能:拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束' \0 '而结束
返回值:返回指向dest的指针 //网上有说返回的是src的指针,这个有待小白考证!
局限性:为考虑内存重叠情况//dest <= src-count 或dest >= src+count时,会产生覆盖问题,即源数据会被更改
函数实现:
4. memmove
头文件:#include < string.h >
函数原型:(void *)memmove(void * dest,void * src,size_t n)//dest为目标内存区,src为源内存区,n为需要拷贝的字节数
函数功能:将src所对应的内存前n的字节的内容移动到dest对应的内存区
返回值:指向dest的指针
注:相比memcpy,当dest与src重叠时,仍能正确处理,但是src的内容会改变
函数实现:
6.名称:memset
功能:初始化指定内存空间
头文件:#include <stdlib.h>
函数原型:void *memset(void *buffer, int c, size_t n);
其中:buffer为分配的内存,c为初始化你内容,n为初始化的字节数
返回值:指向buffer的指针
特别注意:memset是按字节为单位对buffer指向的内存赋值
例:int a[5];
memset(a, 3, 5*sizeof(int)); //错误
上述情况下每个int元素被初始化为:00000011 00000011 00000011 00000011
memset(a, 0, 5*sizeof(int)); //正确,全部初始化为0
7.名称:memcmp
功能:比较两个内存空间的字符
头文件:#include <stdlib.h>
函数原型:int memcmp(const void *buf1, const void *buf2, size_t n);
其中:n为要比较的字符数
返回值:当buf1 > buf2时,返回 > 0;当buf1 = buf2时,返回 = 0;当buf1 < buf2时,返回 < 0。
常见的内存操作函数:
1. malloc / calloc
功能:动态内存分配函数
头文件:#include < stdlib.h >
函数原型:(void *)malloc ( size_t size ); // void *) 代表的是指向不确定类型的指针
(void * )calloc(int num, size_t size)//num为分配内存块的个数,size为分配内存块的大小
返回值:分配成功返回分配内存的首地址,失败返回NULL
区别:a. malloc一次只申请一个内存区,calloc一次可以申请多个内存区(calloc中有个内存块的参数num)
b. malloc不会对分配的内存初始化,calloc会初始化为0
注:malloc和calloc是C里面的用法,综合效果来说,不如C++中new,new不用考虑那么多,直接用即可。
2. free
功能:动态内存释放
头文件:#include < stdlib.h >
函数原型:void free ( ( void * ) ptr)//ptr为malloc或者calloc返回的分配内存的首地址,即内存指针
返回值:无
注:a. free是C中的释放内存的函数,C++中用的是delete,用法:一: delete ptr ;( 释放ptr指针相对应的内存 ) 二: delete [ ] ptr ;( ptr为指向数组的指针 )
b. malloc( calloc )和 free 是一一对应的,若有malloc或者calloc,但是没有free,容易造成内存泄露,同理,new 和 delete 也是一一对应的。
3. memcpy
头文件:#include < string.h >
函数原型:( void * )memcpy ( void * dest,const void * src,size_t n ) //dest为目标内存区,src为源内存区,n为需要拷贝的字节数
函数功能:拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束' \0 '而结束
返回值:返回指向dest的指针 //网上有说返回的是src的指针,这个有待小白考证!
局限性:为考虑内存重叠情况//dest <= src-count 或dest >= src+count时,会产生覆盖问题,即源数据会被更改
函数实现:
void *memcpy(void *dest, void *src, size_t n) { (char *)ret = (char *)dest; (char *)dest_t = ret; (char *)src_t = (char *)src; while(n--) { *dest_t++ = *src_t++; } return ret; }
4. memmove
头文件:#include < string.h >
函数原型:(void *)memmove(void * dest,void * src,size_t n)//dest为目标内存区,src为源内存区,n为需要拷贝的字节数
函数功能:将src所对应的内存前n的字节的内容移动到dest对应的内存区
返回值:指向dest的指针
注:相比memcpy,当dest与src重叠时,仍能正确处理,但是src的内容会改变
函数实现:
void *memmove(void *dest, void *src, size_t n) { char *ret = char *dest; char *dest_t; char *src_t; if((unsigned char *dest <= unsigned char *src) || (unsigned char *dest >= unsigned char *src + n)) { dest_t = char *dest; src_t = char *src; while(n--) { *dest_t++ = *src_t++; //正向拷贝 } } else { dest_t = char *dest + n - 1; src_t = char *src + n - 1; while(n--) { *dest_t-- = *src_t--; //反向拷贝 } } return ret; }
6.名称:memset
功能:初始化指定内存空间
头文件:#include <stdlib.h>
函数原型:void *memset(void *buffer, int c, size_t n);
其中:buffer为分配的内存,c为初始化你内容,n为初始化的字节数
返回值:指向buffer的指针
特别注意:memset是按字节为单位对buffer指向的内存赋值
例:int a[5];
memset(a, 3, 5*sizeof(int)); //错误
上述情况下每个int元素被初始化为:00000011 00000011 00000011 00000011
memset(a, 0, 5*sizeof(int)); //正确,全部初始化为0
7.名称:memcmp
功能:比较两个内存空间的字符
头文件:#include <stdlib.h>
函数原型:int memcmp(const void *buf1, const void *buf2, size_t n);
其中:n为要比较的字符数
返回值:当buf1 > buf2时,返回 > 0;当buf1 = buf2时,返回 = 0;当buf1 < buf2时,返回 < 0。
相关文章推荐
- c++中共享内存操作函数MapViewOfFile解析(二)
- C/C++学习之C提高----函数调用模型、指针做函数参数、字符串的基本操作、一级指针内存模型建立
- c++中共享内存操作函数解析(三)
- [C/C++]更安全的内存操作替代函数
- C/C++ 内存操作函数集合(Buffer Manipulation)
- c++中常用的内存操作函数
- c/c++ 内存操作函数 宏_条件编译
- c++中共享内存操作函数CreateFileMapping解析(一)
- c++ void,内存操作函数
- c/c++内存操作函数 是否初始化
- Delphi 的内存操作函数(4): 清空与填充内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(6): 跨进程的内存分配
- Delphi 的内存操作函数(5): 复制内存
- 自己写的几个ARM汇编内存操作函数
- C/C++函数间动态内存的传递
- 这么详细的分类 VC/C++源代码网站你见过没有? VC/C++中的每一个方法,每一个操作,每一个头文件,每一个函数,每一个类.每一个属性,每一个事件都有相应的范例代码
- C++友元friend --c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
- C++内存分配操作
- C++中文件操作的一些函数