动态存储分配

C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串、数组和结构体

本文地址:http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html,转载请注明源地址。

1、内存分配函数

3种内存分配函数都是声明在<stdlib.h>中:

  • malloc函数--分配内存块,但是不对内存块进行初始化
  • calloc函数--分配内存块,并且对内存块进行消除
  • realloc函数--调整先前分配的内存块

malloc函数不需要对分配的内存快进行清除,所以它比calloc函数更高效

当申请内存块而调用内存分配函数的时候,函数会返回void*型的值。内存中对象的空间大小,是以“字节”的数目为单位计算的,许多头文件都定义了size_t类型,专门用来保存这种“内存”空间的相关信息,比如sizeof运算符返回字节的数目,类型是size_t

2、空指针

由于用名NULL的宏来表示空指针,所以常使用下列方式测试malloc函数的返回值:

p=malloc();
if(p==NULL) {
/*分配失败*/
}

在C语言中,指针测试真假的方法和数的测试一样:

if(p==NULL)
if(!p)
if(p!=NULL)
if(p)

举例如下:

typedef struct {
long key;
/*...*/
}Record;
float *myFunc(size_t n)
{
double *dptr=malloc(sizeof(double));
if(dptr==NULL)
{
/*...*/
return NULL:
}
else
{
*dptr=0.07;
}
/*...*/
Record *rptr;
if(rptr=malloc(*sizeof(Record))==NULL)
{
/*...*/
return NULL;
}
float *fptr=malloc(n*sizeof(float));
if(fptr==NULL)
{
/*...*/
return NULL:
}
/*...*/
return fptr;
}

动态分配数组

使用malloc函数为数组分配存储空间,需要使用sizeof运算符来计算每个元素所需要的空间数量

int *a;
a=malloc(n * sizeof(int));

calloc函数

calloc函数在<stdlib.h>中具有如下的原型:

void *calloc(size_t nmemb, size_t size);

在分配了内存之后,calloc函数会通过对所有位设置为0的方式进行初始化

a=calloc(n, sizeof(int))

struct point{int x,y;}*p;
p=calloc(,sizeof(struct point));

realloc函数

realloc函数可以调整数组的大小使它更适合需要,realloc函数原型在<stdlib.h>中:

void *realloc(void *ptr, size_t size)

ptr指向的内存块一定是先前通过malloc函数、calloc函数或realloc函数的调用获得的,size表示内存块的新尺寸

C语言标准列出几条关于realloc函数的规则:

  • 当扩展内存块时,realloc函数不会对添加进内存块的自己进行初始化
  • 如果realloc函数不能按照要求扩大内存块,那么它会返回空指针,并且在原有的内存块中的数据不会发生改变
  • 如果realloc函数调用时以空指针作为第一个实际参数,那么它的行为就像malloc函数一样
  • 如果realloc函数调用时以0作为第二个实际参数,那么它会释放掉内存块

释放存储

内存分配函数所获得的内存块都来自一个称为堆的存储池

p=malloc(...)
q=malloc(...)
p=q;

上面的代码使得p和q都指向同一块内存,导致出现内存泄露,使用free函数来释放不需要的内存,来回收垃圾

free函数在<stdlib.h>中有如下原型:

void free(void *ptr)

以上的代码改写如下:

p=malloc(...)
q=malloc(...)
free(p);
p=q;

C语言动态存储分配的更多相关文章

  1. C/C++ 动态存储分配

    C语言的动态分配函数: malloc(m):开辟m字节长度的地址空间,并返回这段空间的首地址 sizeof(x):计算变量x的长度 free(p):释放指针p所指变量的存储空间,即彻底删除一个变量 C ...

  2. 全国计算机等级考试二级教程-C语言程序设计_第13章_编译预处理和动态存储分配

    free(p);//释放内存 p = NULL;//软件工程规范,释放内存以后,指针应该赋值为空 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h ...

  3. C语言动态内存分配

    考虑下面三段代码: 片段1 void GetMemory(char *p) { p = (); } void Test(void) { char *str = NULL; GetMemory(str) ...

  4. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

  5. C++语言之动态内存分配

    在C语言中,我们熟悉的内存分配与释放的最常用的接口分别是malloc , free .在C++中: 存在着更加方便的动态存储分配: 1.new 和delete 机制,new 它能更可靠控制存储区的分配 ...

  6. Java中数据存储分配

    (1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...

  7. C++动态内存分配

    C++动态内存分配1.堆内存分配 :C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念:通常定 ...

  8. C++ 动态内存分配(6种情况,好几个例子)

    1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对 ...

  9. [UE4]C++ 动态内存分配(6种情况,好几个例子)

    1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对 ...

随机推荐

  1. SNF开发平台WinForm之四-开发-主细表管理页面-SNF快速开发平台3.3-Spring.Net.Framework

    4.1运行效果: 4.2开发实现: 4.2.1          有了第一个程序的开发,代码生成器的配置应该是没有问题了,我们只要在对应的数据库中创建我们需要的表结构就可以了,如下: 主表结构如下: ...

  2. smartjs 0.2发布 - 新增oop模块&AOP增强

    SmartJS2.0发布,更新内容如下: 新增oop(klass,factory)模块: promiseEvent加入非阻塞模式noBlock: trigger加入属性监听; smartjs主模块优化 ...

  3. PhoneCat App 教程

    https://docs.angularjs.org/tutorial AngularJS教程第一篇文章的翻译,因为我在看中文版的AngularJS的翻译的时候,发现第一篇文章翻译的不准确,很有可能是 ...

  4. win7激活

    应亲戚要求,装了次win7系统,重新删除分区,格盘,重新划分好分区.完毕.发现系统分区全自动变成动态磁盘.使用win7激活工具时,注意选择使用 小马通用版激活工具. 动态磁盘 稍后解释 小马工具

  5. [Math] Deferred Acceptance Algorithm

    约会配对问题 一.立即接受算法: 对于约会的配对,大家都去追自己最心仪的女生.而这个女生面对几位追求者,要立刻做个决定. 被拒绝的男生们调整一下心情,再去追求心中的 No. 2.以此类推. 这样做法有 ...

  6. debian之samba服务器搭建

    安装过程非常简单: apt-get install samba sudo vim /etc/sama/smb.conf [pengdl] comment = pengdl's samba path = ...

  7. Hadoop入门进阶课程1--Hadoop1.X伪分布式安装

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  8. js-异常处理语句

    程序运行过程中难免会出错,出错后的运行结果往往是不正确的,因此运行时出错的程序通常被强制中止.运行时的错误统称为异常,为了能在错误发生时得到一个处理的机会,JavaScript提供了异常处理语句.包含 ...

  9. HT for Web中3D流动效果的实现与应用

    流动效果在3D领域有着广泛的应用场景,如上图中医学领域可通过3D的流动直观的观察人体血液的流动,燃气领域可用于监控管道内流动的液体或气体的流向.流速和温度等指标. 如今企业数据中心机房普遍面临着设备散 ...

  10. 程序代码记Log

    private static object s_lock = new object(); public static void TraceLog(string message, string logF ...