在介绍动态内存分配之前首先要介绍堆区、栈区,堆区栈区是C语言内存五大区(堆区、栈区、全局区、代码区、常量区)的两区。本篇主要介绍堆区和栈区,以及利用堆区进行动态内存分配。
栈区按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。我们代码中的临时变量,局部变量包括调用函数时的传入参数以及返回值都存放在栈区中,其特点是由编译器决定其大小,程序员并不能直接控制栈区。其数据在使用完(例如函数结束)时由系统释放。
而堆区的数据则是由程序员开辟空间存放数据,若程序员不主动释放该空间,则程序结束后可能由OS回收。值得注意的是,我们创建堆区数据时是开辟了一系列的连续内存空间,而这个连续内存空间的首地址是存放在栈区的。
首先是由于栈区的内存普遍较少,如果我们需要很大的空间的话,栈区是不符合需要的。而堆区的内存庞大,完全可以符合我们的要求。

其次,如果我们需要根据需求定义数组长度,而使用变量当作数组长度的操作是非法的,那么我们则需要我们人为开辟指定大小的内存空间,因此我们需要利用堆区来进行动态内存分配。
我们需要了解两个函数:malloc 和 free (C++中为new 和 delete)
使用这两个函数需要#include
malloc 的函数原型如下,void*类型则是未确定类型的指针,c,c++规定void*可以强转为任何其他类型的指针。我们需要使用一个指定类型的指针变量来接收malloc的返回值——开辟的动态内存空间的首地址。该地址存放在栈区,其余空间则是存放在堆区。
extern void *malloc(unsigned int num_bytes);
free的函数原型如下,用以释放我们开辟的内存空间。
extern void free (void* ptr)
实际使用
我们使用如下代码即可开辟我们需要的空间。
#include
#include
#include
int main()
{
int* p = NULL;
p = (int*)malloc(sizeof(int) * 100000000);
}
首先定义一个我们需要的指针类型变量,比方说int * p;
之后使用malloc函数,变量为我们需要的空间,那么就可以使用sizeof函数再乘长度,之后将void * 强制转化为 我们需要的数据类型。
可以看到,即使我们开辟了一千万个长度的空间也没有发生报错。

当然一个好习惯的程序员一定要有一个及时释放的好习惯
free(p);


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!