动态内存分配

来源:互联网 发布:淘宝定金规则 编辑:程序博客网 时间:2024/05/29 19:34

1.C语言的内存分配方式

(1)从静态存储区域分配。内存在程序编译时就已经分配好的,这块内存在程序整个运行期间都存在。如全局变量,static变量(?)

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

(3)在堆上分配,亦称动态内存分配,也即本文要讨论的主要内容。程序在运行的时候用malloc申请任意多少的内存,程序员自己负责在合适用free释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

主要会出现的问题有:

使用未分配的内存

引用分配成功但是尚未初始化的内存

内存分配成功且已初始化但是进行了越界操作

没有释放内存造成内存泄露

释放内存后继续使用这一块内存

使用野指针


2.动态内存分配的相关函数(包含在头文件stdlib.h中)

void *malloc(unsigned int size);

void *calloc(unsigned int n,unsigned int size);

void *realloc(void *ptr,unsigned int size);

void free(void *ptr);

void * alloca(unsigned int size);// 不提倡使用?


(1)void *类型,即未确定类型的指针,可以强制转换为任何其他类型的指针。

(2)malloc向系统申请分配指定size个字节的内存空间,返回首地址,返回类型是void *类型。

(3)calloc向系统申请分配n个长度为size的连续空间,并自动初始化为0,返回首地址,返回类型是void *类型。

(4)realloc先判断当前指针是否有足够空间,如果有,扩大ptr指向的地址并且将ptr返回;如果不够,先按照size指定的大小分配空间,再将原有数据从头到尾拷贝到新分配的内存区域,然后释放原来ptr所指的内存区域(不需要使用free),同时返回新分配的内存区域的首地址,返回类型是void *类型。

(5)free将释放p指向的内存空间,被释放的空间通常被送入可用存储区域。

(6)alloca向系统申请分配指定size个字节的内存空间,返回首地址,返回类型是void *类型。


3.malloc与calloc的区别

alloc会将分配的内存空间都初始化为0,而malloc不会,所分配的内存空间中存储着随机的垃圾数据。

4.alloca与malloc、calloc的区别

malloc和calloc是在堆上申请空间;而alloca是在栈上申请空间,在调用alloca的函数返回时,它分配的内存会自动释放。且alloca不具可移植性,在没有传统堆栈的机器上很难实现。