zoukankan      html  css  js  c++  java
  • C语言动态存储分配

    动态存储分配

    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(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函数的规则:

    • 当扩展内存块时,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;
  • 相关阅读:
    HDFS DataNode 多目录
    HDFS DataNode 退役 旧节点
    HDFS DateNoda 服役 新节点
    HDFS DataNode 时限参数设置
    HDFS NameNode 多目录
    HDFS 安全模式
    HDFS NameNode故障排除
    HDFS CheckPoint时间设置
    HDFS NameNode和SecondaryNameNode
    微信小程序:上拉加载更多
  • 原文地址:https://www.cnblogs.com/wuyudong/p/c-dynamic-storage-allocation.html
Copyright © 2011-2022 走看看