文章目录
什么是内存操作函数?
就是一些能操作计算机内存的C语言内置函数
在讲这些库函数之前, 先讲一讲c语言内存分配几种方式:
-
从静态存储区域分配
这种方式主要是系统用于自动分配给全局变量、static变量内存资源的. 它们在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在. -
在栈上分配
这种方式主要是用于系统自动分配给函数内部的局部变量的,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. -
从堆上分配,亦称动态内存分配.
程序在运行的时候用malloc类或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由用户决定,使用非常灵活,但问题也最多 -
堆与栈:
动态分配内存函数:
1、malloc()函数,calloc()函数和free()函数
- malloc():
malloc()函数用来内存分配,如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当然,对于malloc()函数所对应的就是free()函数,你所开辟的内存,后来当然需要释放。注意malloc()函数是在堆上进行操作的。
void *malloc(size_t size);
用法:(类型可以改变 int char …)
- free()
是用来把在前面分配出去的内存进行回收,以备后备之需。
void free(void *pointer);
2.alloc()函数和realloc()函数
- alloc()
也用于分配内存,它主要是要把分配的内存会初始化为0。
void *calloc(size_t num_elements,size_t element_size);
- realloc()
用于修改一个原先已经分配好的内存块的大小。使用这个函数,可以进行内存的扩大和缩小。
操作内存函数
memset(),函数 memcpy()函数 和 memmove()函数
- memset()
可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组。
void *memset(void *a, int ch, size_t length);
参数解释:是把从a开始的length个字节都初始化成为字符值ch
注意:
1.
这是为什么呢?
其实只有初初始化为0时才能成立 ,因为初始化的值是16进制的,int类型是4个字节
2.
① memset可以重置内存区域的值 初始化值为0 但在char类型中可以初始化相同的值
② memset 重置内存的值,前提是重置区域可读可写
- memcpy()
void *memcpy(void *dst, void const *src, size_t length);
从src的起始位置复制length个字节到dest的内存起始位,memcpy( )函数 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。 可以从栈区拷贝到堆区 也可以从堆区拷贝到栈区
注意:
- dest 指针要分配足够的空间,也即大于等于num 字节的空间。如果没有分配空间,会出现断错误。
- dest 和 src 所指的内存空间不能重叠
与strcpy的区别
① 函数参数不同
两者参数:
void *memcpy(void *dst, void const *src, size_t length);
char *strcpy(char *dest, const char *src)
② strcpy拷贝字符串 (遇到\0停止), memcpy 可以拷贝一块内存
③ strcpy与memcpy拷贝结束标志不同
- memmove()
void *memmove(void *dst, void const *src,size_t length);
函数和memcpy()函数所进行的操作差不多,不过会考虑重叠的问题,所以,对于源和目标参数可能存在重叠问题,那么就可以使用memmove(),当src 和 dest 所指的内存区域重叠时,memmove() 仍然可以正确的处理,不过执行效率上会比使用 memcpy() 略慢些。
注意:
-
拷贝重叠内存地址不会出现问题,但是效率比较低
-
如果拷贝源与拷贝目标没有重叠两个函数效率一样
- memcmp( )
int memcmp(const void *str1, const void *str2, size_t n)
比较s1和s2所指向内存区域的前n个字节
类型不同,但在内存中存的ASCII码相同,所以比较的内容相同
注意: 不限类型比对
栈内存存储过程
栈遵从规则:后进先出 先进后出