c语言内存管理

c语言内存管理

C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。
c语言内存管理
上面的图片来源:https://www.runoob.com/cprogramming/c-memory-management.html

静态内存分配和动态内存分配的区别:
静态内存分配 :存储空间的大小、位置在程序的执行过程中不能改变了,程序结束后内存会自动的收回。
动态内存分配 :在程序执行的过程中存储空间的大小,位置可以发生改变。
当我们要用到一块内存并且知道需要多大的内存时就可以用静态内存分配,我们可以定义一个数组来存放数据。
int a[10];//定义了一个4*10个字节大小的内存空间,且程序结束后会自动的回收所占用的内存。

当我们要用空间但是不知道要用多大空间的时候,就需要动态的分配空间,我们需要用定义一个指针,用指针指向我们开辟的内存空间,如果不够用还可以在添加内存空间,最后需要自己回收内存。
(1)malloc()函数
分配失败返回NULL,分配成功返回一个指针。
函数原型: void *malloc(unsigned int num)
例子:
c语言内存管理
(2)calloc()函数
分配失败返回NULL,分配成功返回一个指针。
函数原型: void *calloc(unsigned int num,unsigned int size)
例子:
c语言内存管理
malloc()函数分配内存时不会初始化数据,里面的数据未知,而calloc()函数会初始化为0。
例:
c语言内存管理
(3)recalloc()函数
分配失败返回NULL,分配成功返回一个指针。
函数原型:void *recalloc(void *address,int newsize);
例:
c语言内存管理
你可能会这样想,我如果觉的空间刚开始分配的太少了想扩容看以再用一次malloc()或calloc()函数,把内存分大点,这样用了两次malloc()或calloc()函数,这样是再分配了一块新的位置新的大小的空间,以前的数据找不到了,但是内存还在占用。
例:
c语言内存管理
c语言内存管理
从上面的图片可以看出,无论是malloc()还是calloc()函数它们再给同一个指针开辟空间,指针的指向变了,也就是说分配了一个全新的空间,不是和原来空间连着的。
我们下面看一下recalloc():
c语言内存管理
可以看到用recalloc()函数重新开辟空间,指针的指向还是原来的指向,以前的数据也没有丢失。
(4)free()函数
free()函数无返回值
函数原型:void free(void *address)
例:
c语言内存管理
最后补充一下其他的知识点:
静态存储: 全局变量(extern),(static)静态变量.
动态存储: 局部变量(auto),寄存器变量(register).