标准C程序设计(八)

20 篇文章 0 订阅
13 动态内存分配与链表
    13.1 动态内存分配
C语言要求在编译时指定数组元素的个数。但我们往往无法在最初判断数组大小,可能导致程序的失败或内存空间的浪费。如果能在运行时分配内存空间(即动态内存分配)就可以避免浪费。尽管C语言本身不具备这种能力,但它有4个名为“内存管理函数”的库例程,可以用来在程序运行时分配和释放内存。
表 13.1 内存分配函数
函数任务
malloc分配所需的字节大小,并返回指向所分配空间的第一个字节的指针
calloc为元素数组分配空间,并初始化为零,然后返回指向该内存的指针
free释放前面已分配的空间
realloc修改前面已分配空间的大小
图13.1 C程序内存分配

  从图中可以看出栈和堆共用一部分空间,分别向不同方向增长。因此当运行时,堆的大小是不断变化的。因为会发生函数或代码块的局部变量的创建和销毁引起栈容量的变化。所以,在动态分配过程中,有可能会遇到内存“溢出”。这种情况下,上面介绍的内存分配函数将返回空指针。
C程序内存分配详情链接:http://blog.chinaunix.net/uid-22312037-id-3637712.html
      13.2 用malloc(memory allocate)函数分配一块内存
 利用malloc函数将保留指定大小的内存块,并返回void类型的指针指向大小为byte-size的内存区首地址。这意味着可以把它赋给任意类型的指针。
   其形式如下:ptr = (cast-type *) malloc ( byte-size);
        13.3 用calloc函数分配多个内存块
calloc是另一个内存分配函数,通常用于在运行时为了存储派生数据类型(如数组和结构体)而分配所需的内存空间。malloc函数分配的是单个存储块,而calloc函数分配的是多个存储块,每个块的大小相等,并把所有字节都设为零。
      其形式如下:ptr = (cast-type *) calloc (n, elem-size);
上面语句分配n块连续的内存空间,每块的大小为elem-size个字节。所有字节都初始化为零,并返回一个指针,它指向所分配区域的第一个字节。如果没有足够的空间,则返回空指针。
        13.4 用free函数释放已用的空间
变量的编译时存储空间是由系统及其存储类来分配和释放的。而对于运行时的内存分配,当不再需要时,有程序员来释放。当存储空间有限的,它的释放就变得很重要了。
当不再需要保存在内存块中的数据时,且不打算用它来存储任何其他信息时,可用free函数来释放掉该内存块,以供日后使用。free函数的使用形式如下:free (ptr);
其中,ptr为指向内存块的指针,该内存块是由malloc或calloc创建的。注意:
  • 所释放的不是指针本身,而是他所指向的内容
  • 要释放calloc分配的内存数组,只需要释放该指针一次即可。试图单独释放每个元素是错误的。
      13.5 用realloc函数改变内存块的大小
如果对已分配的内存空间大小不满意,可以利用realloc进行内存重分配。其形式如下:ptr = realloc(ptr, newsize);
注意:新内存块的开始位置可以(也可以不)与旧的相同。如果在相同区域中找不到其他的内存空间,那么它将在全新的区域中创建,旧块中的内容将移到新块中。该函数保证旧数据的完整性。
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值