Linux C 程序内存管理【笔记】

来源:互联网 发布:cf显示客户端数据异常 编辑:程序博客网 时间:2024/05/19 23:12

根据内存空间的分配方式不同,可分为:静态内存和动态内存。

一、静态内存

        所谓静态内存就是指程序在开始运行时有编译器分配的内存,它的分配在程序开始编译时完成的不需要占用CPU资源。

二、动态内存

       动态内存主要是程序员自行控制内存的分配和释放,其过程往往发生在程序运行过程中。正确的使用动态内存可以提高效率,但是一旦用不好就有可能导致整个项目的坍塌。

三、两者的区别

       1、静态内存的分配是程序在开始编译时完成的,不占用CPU资源;动态内存的分配实在程序运行过程中完成的,动态内存的分配和释放都占用CPU资源。

       2、静态内存在栈上分配;动态内存在堆上分配。

       3、动态内存分配需要指针和引用数据类型的支持;静态内存不需要。

       4、静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态内存的分配是在程序运行中,根据需要随时分配的,属于按需分配。

       5、静态内存的控制权是交给编译器的;而动态内存的控制权是有程序员决定的。

四、动态内存分配

常用的动态内存分配函数有:malloc()、calloc()

        malloc()函数:

原    型: void *malloc(unsigned int num_bytes);

头文件: #include <stdlib.h>或#include <malloc.h>
功    能:分配长度为num_bytes字节的内存块
返回值: 如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
说    明:关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

calloc()函数:

        原    型:void *calloc(unsigned int n, unsigned int size);

        头文件: #include <stdlib.h>#include <malloc.h>
功    能:在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

返回值: 如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

         malloc()和calloc()函数的区别:

calloc()在动态分配完内存后自动初始化内存空间为零,而malloc()不初始化;

calloc()在内存的动态存储中分配n个长度为size的内存块,而malloc()仅分配1个。


       realloc()函数,该函数的功能是调整指定的内存区域的大小;

函数原型:

void *realloc(void *mem_address,unsigned int newsize);

当参数mem_address为NULL时,其功能如同malloc();当参数newsize为0时,其功能就相当于free()。

五、动态内存的释放

通过malloc()、calloc()、realloc()函数分配动态内存,在使用完动态内存后需要使用free()函数释放申请的动态内存,以免造成内存泄漏等问题,内存释放后,原指向内存空间的指针就变成了空指针不能再使用。

free()函数的原型:

void free(void *memblock);

参数memblock表示要被释放的内存块。

原创粉丝点击