常用的内存操作函数
来源:互联网 发布:db2和sql server 编辑:程序博客网 时间:2024/05/22 18:21
接下来我们进行详细剖析一些内存操作的函数:
1.malloc()函数,calloc()函数和free()函数
- malloc()函数和free()函数
malloc()函数原型:
void *malloc(size_t size);
malloc()函数用来内存分配,如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当然,对于malloc()函数所对应的就是free()函数,你所开辟的内存,后来当然需要释放。注意malloc()函数是在堆上进行操作的。
free()函数原型:
void free(void *pointer);
free()函数 是用来把在前面分配出去的内存进行回收,以备后备之需。
- calloc()函数和realloc()函数
calloc()函数原型:
void *calloc(size_t num_elements,size_t element_size);
calloc()函数也用于分配内存,它主要是要把分配的内存会初始化为0。
realloc()函数原型:
void realloc(void *ptr,size_t new_size);
realloc()函数用于修改一个原先已经分配好的内存块的大小。使用这个函数,可以进行内存的扩大和缩小。
这几个函数我在前期的一篇博客中已经详细的叙述过了,在此就不再太多声明了。
C语言之动态分配内存
2.memcpy()函数,memmove()函数和memset()函数
- memcpy()函数
memcpy()函数原型:
void *memcpy(void *dst, void const *src, size_t length);
memcpy()函数实现:
//memcpy( )函数的实现#include<stdio.h>#include<stdlib.h>#include<assert.h>void *my_memcpy(void *dest, const void* src, size_t length){ assert(src); char *pdest = (char *)dest; const char *psrc = (const char *)src; while (length--) { *pdest = *psrc; pdest++; psrc++; } return dest;}int main(){ char arr1[20] = "abcd"; char *arr2 = "efgk"; my_memcpy(arr1, arr2, 2); printf("%s\n", arr1); system("pause"); return 0;}
memcpy()函数从src的起始位置复制length个字节到dest的内存起始位,memcpy( )函数 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。
注意:
dest 指针要分配足够的空间,也即大于等于 num 字节的空间。如果没有分配空间,会出现断错误。
dest 和 src 所指的内存空间不能重叠。
在这里面的重叠问题,就是以下这种情况:
为了解决这一种重叠的问题,在此我们引入了另一个内存操作函数:memmove()函数。
- memmove()函数
memmove()函数原型:
void *memmove(void *dst, void const *src,size_t length);
memmove()函数函数和memcpy()函数所进行的操作差不多,不过会考虑重叠的问题,所以,对于源和目标参数可能存在重叠问题,那么就可以使用memmove(),当src 和 dest 所指的内存区域重叠时,memmove() 仍然可以正确的处理,不过执行效率上会比使用 memcpy() 略慢些。
memmove()函数实现:
//memmove()函数的实现#include<stdio.h>#include<stdlib.h>#include<assert.h>void *my_memmove(void *dst, void * src, size_t length){ assert(dst); assert(src); char *pdest = (char *)dst; const char *psrc = (const char *)src; if ((pdest > psrc) && (pdest<psrc + length)) {//从后向前拷贝 while(length--) { *(pdest+length) = *(psrc+length); } } else {//从前向后拷贝 while(length--) { *pdest++ = *psrc++; } } return dst;}int main(){ int i = 0; int arr1 []= { 1,2,3,5,4,6,8 }; int sz = sizeof(arr1) / sizeof(arr1[0]); my_memmove(arr1 + 2, arr1, 16); for (i = 0; i<sz; i++) { printf("%x ",arr1[i]); } system("pause"); return 0;}
- memset函数
memset函数原型:
void *memset(void *a, int ch, size_t length);
memset()函数是把从a开始的length个字节都设置成为字符值ch,然后返回指向 ptr 的指针。
memset( ) 可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组。
memset函数实现:
//memset()函数实现#include<stdio.h>#include<stdlib.h>#include<assert.h>void *my_memset(void *dest, int n, size_t length){ void *ret = dest; assert(dest); while(length--) { *(char *)dest = n; dest = (char*)dest+1; } return ret;}int main(){ int arr1[10]; int i = 0; int sz = sizeof(arr1) / sizeof(arr1[0]); my_memset(arr1, 0, sz*sizeof(int)); for ( i = 0; i<sz; i++) { printf("%d ",arr1[i]); } system("pause"); return 0;}
- 常用的内存操作函数
- 常用的内存操作函数
- c++中常用的内存操作函数
- C# 内存操作常用函数
- 常用函数-------内存、指针操作函数
- 常用文件及内存操作函数
- 操作内存的一些函数
- 函数调用的内存操作
- C——常用字符串函数、内存操作函数总结
- Delphi 的内存操作函数:复制内存
- 常用的数据操作函数
- 常用的字符串操作函数
- 常用的操作路径函数
- Hive的常用函数操作
- Linux常用C函数-内存及字符串操作篇
- Linux 常用C函数(内存及字符串操作篇2)
- Linux 常用C函数(内存及字符串操作篇1)
- Linux 常用C函数(内存及字符串操作篇1)
- LeetCode 344. Reverse String(字符串翻转)
- ZOJ_1009
- 对copy/strong/weak/__weak/__strong/assign的使用场景总结总结
- 搭建MSSM环境之——安装Maven
- 用R语言把超大文本文件拆分成几个小文本文件
- 常用的内存操作函数
- 强引用和弱引用
- Qt简单编程--对话框式进度条
- 基于AST抽象语法树的SQL注入检测 (2) -- 每周小结(01-02~01-08) - .Little Hann
- HDU 4652 Dice (概率DP)
- Maven安装
- 【转】iOS容易造成循环引用的三种场景
- 最新版 android studio 配置 phonegap (windows环境)
- 浅谈浏览器http的缓存机制