一、静态存储分配与动态存储分配:
(1)静态存储分配
通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;
(2)动态存储分配
有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。
二、动态内存分配函数
1、malloc函数
void *malloc(unsigned int size);
//在内存的动态分配区域中分配一个长度为size的连续空间//堆区
(1)返回值:通用类型(void* 类型可以通过类型转换强制转换为任何其它类型的指针)
分配成功,返回一个指向分配起始地址的指针;
分配失败,返回NULL
(2)注意:
①使用malloc进行动态内存分配后应判断指针是否为空,即是否分配成功;
②申请的内存不会进行初始化,为随机值;
③使用完毕以后必须手动释放内存空间,否则会造成内存泄露
(3)malloc实际分配的内存会大于我们需要的size。主要由两方面因素决定:
1) 字节对齐 : 会对齐到机器最受限的类型(具体的实现因机器而异)。
2)“块头部信息”: 每个空闲块都有“头部”控制信息——结构体(32位),其中包含一个指向链表中下一个块的指针、当前块的大小和一个指向本身的指针。为了简化块对齐,所有块的大小都必须是头部大小的整数倍,且头部已正确对齐。
typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader * pBlockHeaderNext;
struct _CrtMemBlockHeader * pBlockHeaderPrev;
char * szFileName;
int nLine;
size_t nDataSize;//开辟空间大小
int nBlockUse;
long lRequest;
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;