C语言 : 几种常用的内存操作函数汇总

什么是内存操作函数?

就是一些能操作计算机内存的C语言内置函数

在讲这些库函数之前, 先讲一讲c语言内存分配几种方式:

  1. 从静态存储区域分配
    这种方式主要是系统用于自动分配给全局变量、static变量内存资源的. 它们在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.

  2. 在栈上分配
    这种方式主要是用于系统自动分配给函数内部的局部变量的,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.

  3. 从堆上分配,亦称动态内存分配.
    程序在运行的时候用malloc类或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由用户决定,使用非常灵活,但问题也最多

  4. 堆与栈

在这里插入图片描述


动态分配内存函数:

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( )函数 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。 可以从栈区拷贝到堆区 也可以从堆区拷贝到栈区

注意:

  1. dest 指针要分配足够的空间,也即大于等于num 字节的空间。如果没有分配空间,会出现断错误。
  2. 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码相同,所以比较的内容相同

在这里插入图片描述

注意: 不限类型比对


栈内存存储过程

栈遵从规则:后进先出 先进后出

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/haduwi/article/details/105886988
今日推荐