在介绍动态内存分配之前首先要介绍堆区、栈区,堆区栈区是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);


#include<math.h>#
嘉立创PCB

还没有评论,抢个沙发!