设为首页 加入收藏

TOP

C语言动态存储分配
2018-11-20 22:09:31 】 浏览:113
Tags:语言 动态 存储 分配

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


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


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


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


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


p=malloc(10000);
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(2*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(1,sizeof(struct point));


realloc函数


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


void *realloc(void *ptr, size_t size)


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


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


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


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


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


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


void free(void *ptr)


以上的代码改写如下:


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python内置方法详解 下一篇C语言“抢30”游戏代码解析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目